Flutter SQFLite 资产数据库
Flutter SQFLite asset database
我有一个 MYSQL 转储数据库,我将其转换为 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);
我有一个 MYSQL 转储数据库,我将其转换为 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);