Flutter SQFLite资产数据库

问题描述

我有一个MysqL Dumped数据库,我将其转换为sqlite并将其移至Flutter的资产文件夹中。

我正在尝试打开数据库,但它引发以下错误

E/sqliteLog(29199): (8) statement aborts at 1: [PRAGMA user_version = 1] attempt to write a readonly database I/Flutter (29199): error DatabaseException(attempt to write a readonly database (code 8 sqlITE_READONLY)) sql 'PRAGMA user_version = 1' args []} during open,closing...

代码如下:

_initDatabase() async {

    var databasePath = await getDatabasesPath();
    var path = join(databasePath,"example.db");

    var exists = await databaseExists(path);

    if (!exists) {
         print('creating a new copy from asset!');

     try {
         await Directory(dirname(path)).create(recursive: true);
     } catch (_) {}

     ByteData data = await rootBundle.load(join("assets","example.db"));
     List<int> bytes =
      data.buffer.asUint8List(data.offsetInBytes,data.lengthInBytes);

      await File(path).writeAsBytes(bytes,flush: true);
   } else {
      print('opening existing database');
}

return await openDatabase(path,version: _dbVersion,readOnly: true);

}

在上面的方法中它不会引发错误,但是当我尝试查询时(例如,简单的SELECT)。

搜索了类似的问题,但无济于事。有些人说这是一个许可问题,有些人说了一些不同的话。

有人可以告诉我我在做什么错吗?

解决方法

openDatabase期间指定版本是为了执行数据库模式迁移,因此不是只读模式。只需删除version参数,就可以了:

await openDatabase(path,readOnly: true);