Flutter Sqflite onUpgrade()
你好!我正在尝试理解 SQLite 数据库中的 onUpgrade() 或者说数据库迁移是如何工作的,我想分享我的经验,以便每个人都能获得灵感并据此实现。
让我们开始吧
我创建了一个示例应用程序,其中有一个名为 Init Database 的按钮,当用户点击按钮时,它将调用数据库客户端的 init() 方法,有关更多信息,请查看代码。
应用外观
使用版本号 1 创建或初始化数据库
await openDatabase(
dbPath,
version: 1,
onCreate: _createDb,
);
void _createDb(Database db, int version) async {
debugPrint('Database Version onCreate: $version');
}
哇!这太简单了,让我们检查一下上述代码的输出
是的!我的工作完成了,让我将此应用程序发布到 Play Store 或 App Store 吧!
我意识到我错过了表中的一个列
现在怎么办?让我升级数据库,但是怎么升级?现在该轮到 onUpgrade() 方法了,请查看下面的代码片段。
await openDatabase(
dbPath,
version: 2,
onUpgrade: _upgradeDb,
);
void _upgradeDb(Database db, int oldVersion, int newVersion) {
debugPrint('Database Version onUpgrade: OLD: $oldVersion NEW: $newVersion');
}
让我们检查一下上述代码的输出
看起来一切顺利!现在,根据需要,我已将数据库版本增加到 5,它的行为如下
Database Version onUpgrade: OLD: 2 NEW: 3
Database Version onUpgrade: OLD: 3 NEW: 4
Database Version onUpgrade: OLD: 4 NEW: 5
请注意,您上次发布的应用程序的数据库版本号是 5
现在,用户从 Play Store 或 App Store 下载最新应用程序
我的天!应用程序数据库日志很吓人,请查看下面的日志
数据库的前 4 个版本发生了什么?例如,它被跳过了?但是,如果您仔细阅读文档,其中提到如果找不到数据库文件,则使用给定版本创建一个新文件,现在看看在我们的例子中,数据库版本是 5,并且您安装了新应用程序,那么系统就会创建一个新的数据库文件,版本代码为 5。
让我们来解决这个问题
这是最终的,我们必须遵循顺序方式,无论是 onCreate() 还是 onUpgrade(),但如何做到呢?查看下面的代码片段。
await openDatabase(
dbPath,
version: 1,
onCreate: (Database db, int newVersion) async {
for (int version = 0; version < newVersion; version++) {
await _performDbOperationsVersionWise(db, version + 1);
}
},
onUpgrade: (Database db, int oldVersion, int newVersion) async {
for (int version = oldVersion; version < newVersion; version++) {
await _performDbOperationsVersionWise(db, version + 1);
}
},
);
_performDbOperationsVersionWise(Database db, int version) async {
switch (version) {
case 1:
await _databaseVersion1(db);
break;
case 2:
await _databaseVersion2(db);
break;
case 3:
await _databaseVersion3(db);
break;
case 4:
await _databaseVersion4(db);
break;
case 5:
await _databaseVersion5(db);
break;
}
}
_databaseVersion1(Database db) {
debugPrint('Database Version: 1');
}
....
让我们考虑 onCreate() 的情况,现在,如果我们安装了一个新应用程序并且数据库版本是 5,那么它将逐个执行所有版本。
让我们考虑 onUpgrade() 的情况,如果用户很长时间没有更新应用程序(用户有一个旧应用程序,数据库版本号为 1),并且在此期间 开发者发布了 5 个新的数据库版本,那么当用户使用最新数据库版本 5 更新应用程序时会发生什么?
现在是时候从版本 1 迁移到版本 5 了,它将考虑旧版本到新版本之间的所有版本,请查看下面的输出。
结论
数据库迁移不会自动发生,您还需要做一些逻辑工作。
如果您喜欢这篇文章,请点赞,如果您想纠正它,请提议,祝您编码愉快……!!!
关于我
我是 Kishan Donga,您可以通过以下链接与我联系,我是一名开发人员,我热爱创新。
LinkedIn @ikd96 邮箱 [email protected] Twitter @ikishan96 Instagram @ikishan96





