我正在从网站 (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());
}
}
}
最好的