Flutter sqflite - 替换从资产 onUpgrade 复制的数据库
Flutter sqflite - Replace database copied from asset onUpgrade
我在资产中保存了一个本地sqlite数据库,当应用程序打开时,它会被复制。当有新版本的数据库时,旧文件应该被替换。所以我所做的只是再次复制文件。这种方法在模拟器上没有问题,我成功更新了数据库。但是在真机中,数据库复制失败
我正在使用以下代码初始化数据库
initDb() async {
// Construct a file path to copy database to
Directory documentsDirectory = await getApplicationDocumentsDirectory();
String path = join(documentsDirectory.path, 'dictionary');
// Only copy if the database doesn't exist
if (FileSystemEntity.typeSync(path) == FileSystemEntityType.notFound) {
// Load database from asset and copy
ByteData data = await rootBundle.load(join('assets', 'dictionary'));
List<int> bytes =
data.buffer.asUint8List(data.offsetInBytes, data.lengthInBytes);
// Save copied asset to documents
await new File(path).writeAsBytes(bytes);
}
var theDb = await openDatabase(path, version: 4, onUpgrade: _onUpgrade);
return theDb;
}
这是我的onUpgrade
void _onUpgrade(Database db, int oldVersion, int newVersion) async {
var batch = db.batch();
if (oldVersion < newVersion) {
Directory documentsDirectory = await getApplicationDocumentsDirectory();
String path = join(documentsDirectory.path, "dictionary");
ByteData data = await rootBundle.load(join('assets', 'dictionary'));
List<int> bytes = data.buffer.asUint8List(data.offsetInBytes, data.lengthInBytes);
// Save copied asset to documents
await new File(path).writeAsBytes(bytes);
}
await batch.commit();
}
出了什么问题?
我觉得你在onUpgrade:
同时打开db文件是不能替换的
这是一个如何工作的例子
发现问题与数据库无关。这是因为我在加载数据库之前调用的 StoreReview
await 方法。
Future<void> _reviewApp() async {
if (await StoreReview.isAvailable) {
StoreReview.requestReview();
}
}
await
正在阻止加载我的数据库。通过更改为 .then
解决了该问题
_reviewApp() {
StoreReview.isAvailable.then((onValue) {
if(onValue) {
StoreReview.requestReview();
}
});
}
我在资产中保存了一个本地sqlite数据库,当应用程序打开时,它会被复制。当有新版本的数据库时,旧文件应该被替换。所以我所做的只是再次复制文件。这种方法在模拟器上没有问题,我成功更新了数据库。但是在真机中,数据库复制失败
我正在使用以下代码初始化数据库
initDb() async {
// Construct a file path to copy database to
Directory documentsDirectory = await getApplicationDocumentsDirectory();
String path = join(documentsDirectory.path, 'dictionary');
// Only copy if the database doesn't exist
if (FileSystemEntity.typeSync(path) == FileSystemEntityType.notFound) {
// Load database from asset and copy
ByteData data = await rootBundle.load(join('assets', 'dictionary'));
List<int> bytes =
data.buffer.asUint8List(data.offsetInBytes, data.lengthInBytes);
// Save copied asset to documents
await new File(path).writeAsBytes(bytes);
}
var theDb = await openDatabase(path, version: 4, onUpgrade: _onUpgrade);
return theDb;
}
这是我的onUpgrade
void _onUpgrade(Database db, int oldVersion, int newVersion) async {
var batch = db.batch();
if (oldVersion < newVersion) {
Directory documentsDirectory = await getApplicationDocumentsDirectory();
String path = join(documentsDirectory.path, "dictionary");
ByteData data = await rootBundle.load(join('assets', 'dictionary'));
List<int> bytes = data.buffer.asUint8List(data.offsetInBytes, data.lengthInBytes);
// Save copied asset to documents
await new File(path).writeAsBytes(bytes);
}
await batch.commit();
}
出了什么问题?
我觉得你在onUpgrade:
这是一个如何工作的例子
发现问题与数据库无关。这是因为我在加载数据库之前调用的 StoreReview
await 方法。
Future<void> _reviewApp() async {
if (await StoreReview.isAvailable) {
StoreReview.requestReview();
}
}
await
正在阻止加载我的数据库。通过更改为 .then
_reviewApp() {
StoreReview.isAvailable.then((onValue) {
if(onValue) {
StoreReview.requestReview();
}
});
}