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

GitHub

查看 Github