Я получаю данные с веб-сайта (JSON) и сохраняю их в базе данных. Это хорошо работает. Однако я хочу обновлять базу данных с новым номером версии каждый раз, когда изменяются данные, полученные из Интернета. Для этого, я думаю, лучший способ - удалить таблицу, обновить версию номера базы данных и воссоздать таблицу перед заполнением ее новыми данными (по крайней мере, есть способ вставить только новые записи и обновить только старые, имеющие измененная).
Я видел, что это можно сделать с помощью обратного вызова onUpgrade
для базы данных из плагина sqflite .
Итак, я создал 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());
}
}
}
Лучший