4

以下情况仅发生在刚刚在代码中创建的数据库中。以前存在的数据库可以正常工作。

我为数据库助手设置了通常的单例设置,相关部分是:

Future<Database> get database async {
  // ...
  db ??= await openDatabase(
    path.join(await getDatabasesPath(), 'database.db'),
    onCreate: (db, version) async {
      final batch = db.batch();
      batch.execute('CREATE TABLE table1 ...');
      batch.execute('CREATE TABLE table2 ...');
      await batch.commit(noResult: true);
    },
  // ...
  return db;
}

假设数据库还不存在。我调用以下例程:

final db = await database;
await db.transaction((txn) async {
  await txn.delete('table1');
  final batch = txn.batch();
  for (data in newData1)
    batch.insert('table1', data.toJson()));
  await batch.commit(noResult: true);

  await txn.delete('table2');
  final batch = txn.batch();
  for (data in newData2)
    batch.insert('table2', data.toJson()));
  await batch.commit(noResult: true);
});

事务和批处理调用执行没有错误。当整个操作最终实际执行时,它会在第一个DELETE FROM table1SQL 操作上停止,并出现DatabaseException(尝试写入只读数据库(Sqlite 代码 1032)(在 Android 上运行)。

我检查了单例单例,openDatabase没有被调用两次。我也试过交易exclusive: false,没有区别。

4

1 回答 1

0

问题的可能原因是无法访问该表。这种情况的一个已知解决方法是在删除之前打开数据库并关闭它,如GitHub 问题线程中所述。

于 2021-06-16T15:26:10.320 回答