首页 > 解决方案 > 成功提交后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 根本没有抛出任何异常。

我需要一些建议/帮助吗?

标签: fluttersqlitedartsqflite

解决方案


您在事务中混合了批处理调用(即在最后执行)和直接调用,这不太可能提供您期望的行为。您按 id 查询,但插入和更新仅在最后执行(因此查询永远不会返回事务中插入/更新的项目)。不确定我是否清楚。批处理结果列表(您只打印执行的语句数而不是插入/更新结果)应该为您提供每个插入和更新的结果(即,插入可能返回 0)。

我的第一个建议是先尝试不进行批处理,然后等待(并打印以进行调试)每个插入/更新的结果。一旦您对结果感到满意,您可以尝试使用批处理进行优化(或者不这样做,因为它在这里不太可能给您带来太多好处,批处理只是发送到本机实现的一组语句)。


推荐阅读