一尘不染

有没有办法使用sqflite在flutter应用程序中检查数据库版本?

flutter

我是新手,但我对使用sqflite的这些应用程序进行数据库版本控制有一些疑问。

我已经在我的资产文件夹中创建了一个数据库文件,该数据库文件在启动应用程序时复制到用户的设备上。我想知道是否有任何方法可以检查用户拥有的数据库文件的当前版本,从而不必每次都复制它?

案例:我对Google
Play商店中随应用程序更新一起提供的数据库文件进行了更新。是否可以检查用户当前拥有的数据库文件的版本,以确定是否应使用新文件替换旧文件?

如果是这样…每次更新我的应用程序时都可以执行此检查吗?每次打开应用程序时都需要这样做吗?

如果没有,如何最好地处理?处理存储在用户设备上的文件的数据库更新的最佳方法是什么?


阅读 322

收藏
2020-08-13

共1个答案

一尘不染

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;
      }
    }
2020-08-13