如何使用 sqlite 数据库升级 flutter 应用程序?
How do you upgrade a flutter app with sqlite database?
我有一个使用 SQLITE 数据库的 flutter 应用程序。
我想发布应用程序商店和 google Play 商店中的应用程序的新版本更新。
新版本将有新的列和新的表。
要在我的应用程序中包含哪些高级步骤才能使该应用程序
a) 从现有数据库中复制所有现有用户记录
b) 将这些粘贴到新数据库中 - post upgrade
当然我可以将我所有的记录放在一个动态列表中——这就是我所做的,但是我使用什么触发器以便当用户升级到新版本时(通过 App Store 或 google play store) 我们可以优雅地将所有用户数据从现有数据库复制到新版本吗?
TL:DR
迁移示例
这是一个简单的数据库架构迁移示例,其中:
a column is added to an existing table
a table is added
// Our database path
String path;
// Our database once opened
Database db;
第一版
第一个版本创建一个带有名称列的公司 table。
/// 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));
第二版
假设我们要添加一个新的 table 员工并引用公司实体。我们还想在 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));
更改应用程序架构后,您将必须重新启动应用程序。除非您正确关闭当前打开的数据库,否则 Flutter Hot-reload 将无法工作。
我有一个使用 SQLITE 数据库的 flutter 应用程序。 我想发布应用程序商店和 google Play 商店中的应用程序的新版本更新。
新版本将有新的列和新的表。
要在我的应用程序中包含哪些高级步骤才能使该应用程序 a) 从现有数据库中复制所有现有用户记录 b) 将这些粘贴到新数据库中 - post upgrade
当然我可以将我所有的记录放在一个动态列表中——这就是我所做的,但是我使用什么触发器以便当用户升级到新版本时(通过 App Store 或 google play store) 我们可以优雅地将所有用户数据从现有数据库复制到新版本吗?
TL:DR
迁移示例
这是一个简单的数据库架构迁移示例,其中:
a column is added to an existing table a table is added
// Our database path
String path;
// Our database once opened
Database db;
第一版
第一个版本创建一个带有名称列的公司 table。
/// 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));
第二版
假设我们要添加一个新的 table 员工并引用公司实体。我们还想在 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));
更改应用程序架构后,您将必须重新启动应用程序。除非您正确关闭当前打开的数据库,否则 Flutter Hot-reload 将无法工作。