前段时间公司项目在版本迭代比较频繁,而且数据库要添加新的字段,发现新增字段没法直接通过sql语句的方式直接插入到数据库中,现有的项目中没有完善可靠的数据库迁移方案,搜了一些资料,发现FMDBMigrationManager配合FMDB使用,可完成数据库的搭建和迁移工作,分享一下使用心得。
使用前提 : 项目中的数据库需要使用FMDB搭建, FMDBMigrationManager才能配合实现数据库的迁移操作。
使用步骤:
一、创建数据库:
考虑多线程的话,可直接创建FMDatabaseQueue的实例对象;不考虑多线程可直接创建FMDatabase对数据库直接操作,这里我直接使用多线程创建数据库和对应的数据表:
创建数据库和迁移逻辑
注:第一次创建数据库时,根据自己业务创建对应的数据库表跟字段即可,迁移逻辑可不写;在后续的版本迭代中,如数据库表有字段变更,即可添加数据库迁移逻辑。即初次创建数据库只执行上诉代码1、2步即可,3、4步迁移逻辑后面需要再添加。
创建数据库
创建Student表
插入表数据
这里浏览数据库表的软件我使用的是Navicat Premium,很好用的一款软件,能直接在软件内编写SQL语句。
打开对应的表结构:
二、说明下创建迁移逻辑的步骤及注意事项:
1、首先创建迁移类ZTCMigration, 并遵守FMDBMigrating协议
ZTCMigration.h
ZTCMigration.m
.m中最后一个方法为实现FMDBMigrating协议方法,使用在下面讲到
2、迁移类写好后,可以开始梳理迁移逻辑
例如:在项目下个版本的需求中要给数据库表添加email, score字段
迁移逻辑
说明:
a、首先创建FMDBMigrationManager实例对象,用来管理每个版本数据库的变更;
b、每个版本中,如果数据库有变更,都要创建ZTCMigration实例对象,调用初始化方法,传入对应的描述、版本号、数据库变更需要操作的SQL语句,这里可以是多个,即传入数组;
c、下面语句会在本地数据库生成迁移版本hash表,每次数据库变更,此表都会添加一条记录,记录每次变更的版本号。如果本地没有,上述语句会创建;
创建迁移表
d、最关键的一句是执行这一步操作:
resultState = [manager migrateDatabaseToVersion:UINT64_MAX progress:nil error:&error];
这步会调用FMDBMigrationManager实例对象的方法,走到方法内部:
这里会通过每次数据库变更添加的版本号,找到对应的migration对象,调用它内部实现的FMDBMigrating协议方法,如下所示:
在这里逐个执行本次变更的数据库语句,即完成本次版本对数据库的操作。
3、针对今天加的字段插入匹配的数据
插入新增表字段数据
用Navicat Premium再次打开本地数据表
新增表字段已插入表中并填充了表数据。
对于版本迭代过程中,其他的针对数据库表的操作也同样适用,这里只用添加表字段的操作说明下迁移方案的使用及原理。
以上是数据库的迁移逻辑。
希望这次的分享能够帮其他人解决类似的问题。