Есть ли способ проверить версию базы данных в приложении флаттера с помощью sqflite? - PullRequest
1 голос
/ 28 февраля 2020

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

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

Случай: я делаю обновление для файла базы данных, который поставляется с обновлением приложения в магазине Google Play. Можно ли проверить версию файла базы данных, которая есть у пользователя в данный момент, чтобы определить, должен ли новый файл заменить старый?

Если так ... Могу ли я делать эту проверку каждый раз, когда обновляю свое приложение? Нужно ли делать это каждый раз, когда приложение открывается?

Если нет .. Как это лучше всего обрабатывается? Каков наилучший способ обработки обновлений базы данных файлов, хранящихся на устройстве пользователя?

1 Ответ

3 голосов
/ 29 февраля 2020

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

    class DbHelper {
      static const NEW_DB_VERSION = 2;

      static final DbHelper _instance = DbHelper.internal();

      factory DbHelper() => _instance;

      DbHelper.internal();

      Database _db;

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

      Future<Database> initDb() async {

        final databasesPath = await getDatabasesPath();
        final path = join(databasesPath, "database.db");

        var db = await openDatabase(path);

        //if database does not exist yet it will return version 0
        if (await db.getVersion() < NEW_DB_VERSION) {

          db.close();

          //delete the old database so you can copy the new one
          await deleteDatabase(path);

          try {
            await Directory(dirname(path)).create(recursive: true);
          } catch (_) {}

          //copy db from assets to database folder
          ByteData data = await rootBundle.load("assets/databases/database.db");
          List<int> bytes = data.buffer.asUint8List(data.offsetInBytes, data.lengthInBytes);
          await File(path).writeAsBytes(bytes, flush: true);

          //open the newly created db 
          db = await openDatabase(path);

          //set the new version to the copied db so you do not need to do it manually on your bundled database.db
          db.setVersion(NEW_DB_VERSION);

        }

        return db;
      }
    }

...