Flutter sqflite - заменить базу данных, скопированную из ресурса на Upgrade - PullRequest
0 голосов
/ 28 апреля 2020

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

Что пошло не так?

Ответы [ 2 ]

1 голос
/ 29 апреля 2020

Я думаю, вы не можете заменить файл БД, когда открываете его одновременно в onUpgrade:

, вот пример, как это работает Есть ли способ проверить версию базы данных в флаттер приложение с использованием sqflite?

0 голосов
/ 07 мая 2020

Обнаружено, что проблема не связана с базой данных. Именно из-за этого StoreReview метода ожидания, который я вызвал до загрузки базы данных.

Future<void> _reviewApp() async {
    if (await StoreReview.isAvailable) {
      StoreReview.requestReview();
    }
  }

await блокирует загрузку моей базы данных. Исправлена ​​проблема путем изменения на .then

_reviewApp() {
    StoreReview.isAvailable.then((onValue) {
      if(onValue) {
        StoreReview.requestReview();
      }
    });
  }
...