flutter sqlite事务使用错误警告数据库已被锁定 [英] flutter sqlite transaction usage error warning database has been locked for

查看:332
本文介绍了flutter sqlite事务使用错误警告数据库已被锁定的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在开发使用sqlite和事务处理的移动应用程序.

I am developing a mobile application that use sqlite and transaction.

下面的代码是通过使用sqlite事务保存模型从用户那里获取订单信息到多个数据库表.

Below code is that getting order information from user using by using sqlite transaction saving model to multiple db tables.

Future<AppResult<int>> save(Order order) async {
    Database db;
    var dbReturn = BaseService();
    try {
      db = await databaseOpen();
      int dbSaveResult = 0;
      await db.transaction((txn) async {
        var batch = txn.batch();
        final List<Map<String, dynamic>> exist = await db.query(tableName, where: "id =?", whereArgs: [order.id]);
        if (exist.length == 0) {
          await _insert(order, txn, batch);
        } else {
          await _update(order, txn, batch);
        }
        await batch.commit(continueOnError: true).then((value) {
          if (value.length > 0) dbSaveResult = value.length;
        });
      });
      return dbReturn.success<int>(dbSaveResult, "Kaydedildi", 1, 1);
    } on Exception catch (e) {
      return dbReturn.failed<int>(-1, "OrderDbService -> save", 0, 0, e);
    } finally {
      if (db != null && db.isOpen) {
        await db.close();
      }
    }
  }



 Future<void> _insert(Order order, Transaction txn, Batch batch) async {
    try {
      order = setEntityValue(order, false);
      order = _setOrder(order, order.lines);

      batch.insert(tableName, order.toMap(), conflictAlgorithm: ConflictAlgorithm.replace);

      await _saveLines(order.lines, txn, batch);
      await _saveDescriptions(order.descriptions, txn, batch);
      await _saveDetail(order.detail, txn, batch);
      await _saveDiscounts(order.discounts, txn, batch);
      await _saveExchangeRates(order.exchangeRates, txn, batch);
    } on Exception catch (e) {
      throw e;
    }
  }

在调用sqlite方法后,将引发如下消息

after calling the method sqlite throw a message as below

D/Sqflite ( 8938): [57,main(2)] starting threadThread[Sqflite,5,main] priority 10
D/Sqflite ( 8938): [57,main(2)] opened 57 /data/user/0/com.tttt.mobileApp/databases/tttt.db
D/Sqflite ( 8938): [57,Sqflite(484)] opened 57 /data/user/0/com.tttt.mobileApp/databases/tttt.db
D/Sqflite ( 8938): [57,Sqflite(484)] BEGIN IMMEDIATE
I/flutter ( 8938): Warning database has been locked for 0:00:10.000000. Make sure you always use the transaction object for database operations during a transaction

推荐答案

已解决:确保您不在事务内使用数据库实例

SOLVED: be sure you don't use db instance inside the transaction as below

await db.query(tableName, where: "id =?", whereArgs: [order.id]);

代替下面的用法

await txn.query(tableName, where: "id =?", whereArgs: [order.id]);

flutter不会警告您任何交易使用错误.

flutter does not warn you about any transaction usage error.

这篇关于flutter sqlite事务使用错误警告数据库已被锁定的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆