hou*_*uba 8 upgrade dart flutter
我有一个使用 SQLITE 数据库的 flutter 应用程序。我想发布应用程序商店和谷歌游戏商店中的应用程序的新版本更新。
新版本将有新的列和新的表。
我的应用程序中要包含哪些高级步骤,以便该应用程序 a) 从现有数据库复制所有现有用户记录 b) 将这些记录粘贴到新数据库中 - 升级后
当然,我可以将所有记录放在动态列表中 - 这就是我所做的,但是我应该使用什么触发器,以便当用户升级到新版本(通过 App Store 或 google play store)时我们可以优雅地复制将所有用户数据从现有数据库转移到新版本?
G g*_*ffo 10
翻译:博士
迁移示例
这是数据库架构迁移的一个简单示例,其中:
将一列添加到现有表中 添加一个表
// Our database path
String path;
// Our database once opened
Database db;
Run Code Online (Sandbox Code Playgroud)
第一版
第一个版本创建一个带有名称列的 Company 表。
/// Create tables
void _createTableCompanyV1(Batch batch) {
batch.execute('DROP TABLE IF EXISTS Company');
batch.execute('''CREATE TABLE Company (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT
)''');
}
// First version of the database
db = await factory.openDatabase(path,
options: OpenDatabaseOptions(
version: 1,
onCreate: (db, version) async {
var batch = db.batch();
_createTableCompanyV1(batch);
await batch.commit();
},
onDowngrade: onDatabaseDowngradeDelete));
Run Code Online (Sandbox Code Playgroud)
第二版
假设我们要添加一个新表 Employee 并引用 Company 实体。我们还想在 Company 实体中添加新的列描述。
我们在 中处理新数据库的创建onCreate
并在 中处理架构迁移onUpgrade
。另外,由于我们想使用外键约束,因此我们在中配置访问权限onConfigure.
/// Let's use FOREIGN KEY constraints
Future onConfigure(Database db) async {
await db.execute('PRAGMA foreign_keys = ON');
}
/// Create Company table V2
void _createTableCompanyV2(Batch batch) {
batch.execute('DROP TABLE IF EXISTS Company');
batch.execute('''CREATE TABLE Company (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT,
description TEXT
)''');
}
/// Update Company table V1 to V2
void _updateTableCompanyV1toV2(Batch batch) {
batch.execute('ALTER TABLE Company ADD description TEXT');
}
/// Create Employee table V2
void _createTableEmployeeV2(Batch batch) {
batch.execute('DROP TABLE IF EXISTS Employee');
batch.execute('''CREATE TABLE Employee (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT,
companyId INTEGER,
FOREIGN KEY (companyId) REFERENCES Company(id) ON DELETE CASCADE
)''');
}
// 2nd version of the database
db = await factory.openDatabase(path,
options: OpenDatabaseOptions(
version: 2,
onConfigure: onConfigure,
onCreate: (db, version) async {
var batch = db.batch();
// We create all the tables
_createTableCompanyV2(batch);
_createTableEmployeeV2(batch);
await batch.commit();
},
onUpgrade: (db, oldVersion, newVersion) async {
var batch = db.batch();
if (oldVersion == 1) {
// We update existing table and create the new tables
_updateTableCompanyV1toV2(batch);
_createTableEmployeeV2(batch);
}
await batch.commit();
},
onDowngrade: onDatabaseDowngradeDelete));
Run Code Online (Sandbox Code Playgroud)
更改应用程序架构时,您必须重新启动应用程序。除非您正确关闭当前打开的数据库,否则 Flutter 热重载将无法工作。
归档时间: |
|
查看次数: |
8546 次 |
最近记录: |