flutter - 成功提交后flutter sqflite事务不插入记录
问题描述
在 Flutter 项目中使用 sqflite 数据库,我需要一些帮助。
下面你可以看到我的交易代码
await db!.transaction((txn) async {
var batch = txn.batch();
for (DespatchTransaction despatch in transactions) {
if (isSynced) {
despatch.isSynced = 1;
despatch.syncDate = DateTime.now();
}
final List<Map<String, dynamic>> exist = await txn.query(tableName, where: "id =?", whereArgs: [despatch.id]);
if (exist.length == 0)
_insert(despatch, txn, batch);
else
_update(despatch, txn, batch);
}
await batch.commit(continueOnError: false).then((value) {
if (value.length > 0) dbSaveResult = value.length;
});
});
并插入如下代码块
batch.insert(tableName, item.toMap(),conflictAlgorithm: ConflictAlgorithm.replace);
我已经在 sqflite 数据库打开了调试模式,可以看到事务插入语句和提交命令
D/Sqflite (14181): [2,Sqflite(850)] INSERT OR REPLACE INTO DespatchTransactions (id, isActive, createdUser, createdDate, updatedDate, updatedUser, isSynced, syncDate, sourceId, sourceName, applicationType, statusId, companyId, branchId, warehouseId, employeeId, accountId, currencyType, tradeType, documentType, subDocumentType, directionType, documentDate, transactionDate, projectId, costCenterId, despatchAddressId, invoiceAddressId, isReturned, serial, number, documentId, description, lineCount, lineExtensionAmount, taxInclusiveAmount, taxExclusiveAmount, allowanceTotalAmount, chargeTotalAmount, payableRoundingAmount, payableAmount, vatTotal, taxTotal, deductionTotal, cargoTransactionId, detailId, eDocumentId, integrationId) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, NULL, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, NULL, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, NULL, NULL, NULL, NULL) [da4d5b2a-3730-455f-9388-f1cdcc59c3c7, 1, c0e7b68a-90af-488d-97ce-08d83de6f8df, 2021-08-11T21:45:18.373228, 2021-08-11T21:45:18.373238, c0e7b68a-90af-488d-97ce-08d83de6f8df, 1, 2021-08-11T21:45:18.371369, 9995af04-c946-42c3-a6a7-fd6c9374ec21, Eqlem Mobil Uygulama, 9998, 5155eb76-8ff0-4068-59c5-08d83de65f2d, bd1b9d20-4ce2-4b23-0352-08d83de81a96, a4d26dcb-ab72-4c8b-9170-baefe4a0ea70, 645193c6-002e-4fe2-5ac5-08d83de82cd8, 88293574-97c7-452b-b629-0683c2bd8268, 1, 0, 102, 101, 1, 2021-08-11T12:17:51.204862, 2021-08-11T12:17:51.204869, acaf97d2-00d0-49b2-ff24-08d87f29ef6c, 6325c200-a695-4e45-6c75-08d87f294e0b, 6b8e77a0-6aa1-44bf-8b5b-0eca7b2b5bac, c62f3f2f-d1da-4cea-8de9-82e1e3359e46, 0, MBL, 0, E61C6CD99D7, 1, 900.0, 1062.0, 900.0, 0.0, 0.0, 0.0, 1062.0, 162.0, 0.0, 0.0]
D/Sqflite (14181): [2,Sqflite(850)] inserted 23
D/Sqflite (14181): [2,Sqflite(850)] COMMIT
当我检查表上的记录时,没有插入任何记录,Flutter 根本没有抛出任何异常。
我需要一些建议/帮助吗?
解决方案
您在事务中混合了批处理调用(即在最后执行)和直接调用,这不太可能提供您期望的行为。您按 id 查询,但插入和更新仅在最后执行(因此查询永远不会返回事务中插入/更新的项目)。不确定我是否清楚。批处理结果列表(您只打印执行的语句数而不是插入/更新结果)应该为您提供每个插入和更新的结果(即,插入可能返回 0)。
我的第一个建议是先尝试不进行批处理,然后等待(并打印以进行调试)每个插入/更新的结果。一旦您对结果感到满意,您可以尝试使用批处理进行优化(或者不这样做,因为它在这里不太可能给您带来太多好处,批处理只是发送到本机实现的一组语句)。
推荐阅读
- angular - 如何在组件测试中伪造/模拟/监视服务以避免 Angular 9 / Jasmine / Karma 的 NullInjectorError?
- php - 结合pagerfanta的搜索结果
- java - java双数组操作
- javascript - 使用 javascript 将焦点设置到 Web 表单中的另一个字段
- oracle - 如何使用 | 生成 CSV 使用 Oracle 过程分隔值
- node.js - VueJS 应用程序中的 Cloud Foundry VCAP_SERVICES
- angular - 如何使用 Angular 在 Kendo Tabstrip 中实现关闭选项卡按钮
- azure - 如何使用相同的 ADO 管道部署到开发、登台和生产
- python - 发送文本并在 expath 上单击 ENTER
- python-3.x - 如何在一个屏幕上从 TextInput 添加多个数据并在另一个屏幕上使用 kivy?