sqflite如何检查数据库版本号并升级?

码云
2020-11-27 09:33

flutter app升级时经常会升级数据库,如何检查数据库的版本号并根据版本号决定是否升级数据库,参考以下示例代码:

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) {
      _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 (await db.getVersion() < NEW_DB_VERSION) { //需要升级

      db.close();

      //删除老版本的数据库
      await deleteDatabase(path);

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

      //拷贝新数据库
      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);

      //打开新的数据库
      db = await openDatabase(path);

      //设置新的版本号
      db.setVersion(NEW_DB_VERSION);

    }
    return db;
  }
}

 

全部评论