1

我正在从网站 (JSON) 获取数据并将其保存在数据库中。这很好用。但是,每次从 Internet 获取的数据发生变化时,我都想用新的版本号升级数据库。为此,我认为最好的方法是删除表,升级数据库编号版本并在用新数据填充表之前重新创建表(至少有一种方法只插入新记录并只更新旧记录)改变)。

我看到它可以通过sqflite插件onUpgrade的数据库回调来完成。

因此,我创建了一个Helper使用init()打开数据库的方法。但是,我不明白何时onUpgrade调用回调。实际上,在下面的这段代码中,version总是为 1。

我想有一个方法来初始化数据库和:

  • 如果它不存在则创建它或
  • 如果未指定数字版本(类似),则打开当前版本或
  • 通过自动增加版本号(例如通过调用 database.upgrade())升级到新版本。

您认为这可以通过一种独特的方法实现,还是我需要将其分成两种方法?如果是,onUpgrade回调的意义何在?

class DBHelper {
  // Private constructor
  DBHelper._privateConstructor();

  // Get an instance of DBHelper
  static final DBHelper _dbHelper = DBHelper._privateConstructor();

  // Getter to get the instance of the DBHelper
  factory DBHelper() => _dbHelper;

  static Database _database;

  Future<Database> get database async {
    if (_database != null) return _database;
    // lazily instantiate the db the first time it is accessed
    _database = await init();
    return _database;
  }

  Future<Database> init() async {
    print("DBHelper: init database");
    // Get a location using path_provider
    String path = await getDBPath();
    // I THINK ALL HAPPENS HERE
    return await openDatabase(path, version: 1, onCreate: _onCreate, onUpgrade: _onUpgrade);
  }

  void _onCreate(Database db, int version) async {
    print("DBHelper: _onCreate called");
    // When creating the db, create the table
    _createTable();
  }

  void _onUpgrade(Database db, int oldVersion, int newVersion) async{
    print("DBHelper: _onUpgrade called");
    try {
      await db.transaction((Transaction txn) async {
        await txn.execute("DROP TABLE TABLE_NAME");
      });
    } catch (e) {
      print("Error : " + e.toString());
    }
    _createTable();
  }

  void _createTable() async {
    Database db = await database;
    try {
      await db.transaction((Transaction txn) async {
        await txn.execute("CREATE TABLE TABLE_NAME ("
            "TABLE_ID INTEGER PRIMARY KEY AUTOINCREMENT,"
            "TABLE_INT INTEGER,"
            "TABLE_TEXT TEXT,");");
      });
    } catch (e) {
      print("Error : " + e.toString());
    }
  }
}

最好的

4

1 回答 1

0

sqflite 中的数据库版本控制与 Android 中所做的相匹配,其中版本对于具有特定模式的应用程序的特定版本是一个常量。onCreate/onUpgrade通常应该在应用程序的生命周期中只调用一次。无论如何,除非您关闭并重新打开数据库,否则它不会被调用。请参阅https://github.com/tekartik/sqflite/blob/master/sqflite/doc/migration_example.md

所以我会说现在存在的用户版本不符合您的需要。所以我不会onUpgrade在你的场景中使用这个值。但是,您可以定义自己的单例值(即您自己的版本控制系统)并在数据库打开时在事务中删除/创建表。没有什么能阻止你这样做。

于 2019-06-12T09:00:46.220 回答