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

Is there a way to check the database version in a flutter app using sqflite?

我是 flutter 的新手,我对数据库版本控制如何使用 sqflite 为这些应用程序工作有一些疑问。

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

案例: 我对 google Play 商店中的应用程序更新附带的数据库文件进行了更新。 是否可以检查用户当前拥有的数据库文件的版本以确定新文件是否应该替换旧文件?

如果是这样...我可以在每次更新我的应用程序时都进行此检查吗?每次打开应用程序时都必须这样做吗?

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

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;
      }
    }