Удаление базы данных с помощью sqlflite во флаттере не работает - PullRequest
0 голосов
/ 24 января 2019

Для моего приложения я загружаю в предварительно заполненную базу данных некоторые данные для начинающих / по умолчанию для пользователя, следующие этому уроку: https://github.com/tekartik/sqflite/blob/master/doc/opening_asset_db.md Во время отладки я собираюсь добавить / удалить несколько тестовданные и не нужно вручную сбрасывать вещи каждый раз, когда я хочу перезагрузить приложение, поэтому я каждый раз загружаю свежую копию из базы данных.

Однако по какой-то причине он не загружает новую копию из ресурса, а по-прежнему открывает существующую измененную базу данных.Я проверил файл ресурса, и он не был изменен, и блок, который открывает существующую базу данных на машине без удаления предыдущей версии, не достигнут.

Я также не получаю никаких ошибок в консоли.

Вот код для инициализации базы данных:

static Database _db;

  Future<Database> get db async {
    if(_db != null)
      return _db;
    _db = await initDb();
    return _db;
  }

  bool get isInDebugMode {
    bool inDebugMode = false;
    assert(inDebugMode = true);
    return inDebugMode;
  }

  //load database from existing db or copy pre-loaded db from assets
  initDb() async {
    //if in debug mode always load from asset file
    //done to reload from asset when default values added to database asset
    //and get rid of testing data
    //since it would be annoying to have to delete the file on the emulator every time

    debugPrint("initializing the db connection");
    var databasesPath = await getDatabasesPath();
    var path = join(databasesPath, "myDatabase.db");

    if(isInDebugMode){
      // delete existing if any
      await deleteDatabase(path);

      // Copy from asset
      ByteData data = await rootBundle.load(join("assets", "assetDB.db"));
      List<int> bytes = data.buffer.asUint8List(data.offsetInBytes, data.lengthInBytes);
      await new File(path).writeAsBytes(bytes);

      // open the database
      var db = await openDatabase(path, readOnly: false);
      return db;

    } else {
      // try opening (will work if it exists)
      Database db;
      try {
        db = await openDatabase(path, readOnly: false);
      } catch (e) {
        print("Error $e");
      }

      if (db == null) {
        // Should happen only the first time you launch your application
        print("Creating new copy from asset");

        // Copy from asset
        ByteData data = await rootBundle.load(join("assets", "assetDB.db"));
        List<int> bytes =
        data.buffer.asUint8List(data.offsetInBytes, data.lengthInBytes);
        await new File(path).writeAsBytes(bytes);

        //debugPrint(bytes.length.toString());

        // open the database
        db = await openDatabase(path, readOnly: true);
      } else {
        print("Opening existing database");
      }

      return db;
    }

  }

Я должен упомянуть, что я не делаюгорячая перезагрузка, когда я загружаю эти изменения, и достигается блок, который инициализирует новую базу данных из ресурса, когда он находится в режиме отладки.

Спасибо за вашу помощь!

1 Ответ

0 голосов
/ 04 февраля 2019

Горячая перезагрузка и плагины не всегда хорошо играют вместе, если вы не проявите особую осторожность.В вашем случае вы пытаетесь удалить базу данных, которая еще может быть открыта.Поэтому вы должны попытаться закрыть его перед удалением.Одним из решений является сохранение глобальной ссылки на базу данных и ее закрытие перед вызовом deleteDatabase

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...