У меня есть локальная база данных 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();
}
Что пошло не так?