一、数据库的升级
FMDB的数据迁移用FMDBMigrationManager这个工具类,FMDBMigrationManager 是与FMDB结合使用的一个第三方类库,可以记录数据库版本号并对数据库进行数据库升级等操作。
1、FMDB数据库升级有二种方式:
第一种、添加文件的方式进行记录版本和升级操作,先关联FMDBMigrationManager,再创建数据库升级文件,最后升级。
第二种、使用自定义类的形式进行迁移。先关联FMDBMigrationManager,再创建自定义类,并且遵循FMDBMigrationManager协议,最后把创建的自定义的类型加入到FMDBMigrationManager中,升级。
使用FMDBMigrationManager去
注意:上述两种数据库的升级方式都需要自己写sql语句。这就意味着,你需要熟练使用sql命令。

第一种:数据库升级的步骤:

1、集成FMDBMigrationManager
可以使用cocoapods或者手动集成

2、将要升级的的数据库和FMDBMigrationManager关联起来
   注意:oldPath 要升级数据库的路径

FMDBMigrationManager * manager=[FMDBMigrationManager managerWithDatabaseAtPath:oldPath migrationsBundle:[NSBundle mainBundle]];
BOOL resultState=NO;
NSError * error=nil;
if (!manager.hasMigrationsTable) {
resultState=[manager createMigrationsTable:&;error];
}

执行了上面的代码以后,会发现多了一个 schema_migrations的表。
这个表是用来存储版本号的,现在表中的版本号(version)为0 ,rowid是升级文件“_”前面的数字。

 注意:
下面这句代码是升级数据库的主要代码
 UINT64_MAX 表示升级到最高版本

resultState=[manager migrateDatabaseToVersion:UINT64_MAX progress:nil error:&;error]; 

3、创建升级文件(sql文件)
我们说的升级文件就是sql文件,里面写的是数据库操作的sql语句.
sql文件的文件名的格式都是是固定的 (数字)_(描述性语言).sql,最前面的数字就是版本号,可以使用1,2,3,4,5……升级,保持单调递增即可;也可以使用时间戳,官方建议使用时间戳,sql文件内写入要对数据库做的操作的sql语句。
注意:
可以命令行创建相应的sql文件,XXXXXXXXXXXXX是描述性语言。

$ touch "`ruby -e "puts Time.now.strftime('%Y%m%d%H%M%S%3N').to_i"`"_XXXXXXXXXXXXX.sql

然后把sql文件拖入我们的工程中

这时FMDBMigrationManager将会根据创建时给入的NSBundle自行寻找sql文件,进行版本号对比操作。添加sql文件之后,重启该项目,再运行一次升级代码,这时查看数据库,这时你就会发现刚刚在sql文件中创建的Student表了。
如果你想在Student表中添加一个新的字段,可以再添加一个sql文件,在里面写上你需要执行的sql命令,再把这个文件拖入工程中。重新启动项目,这时,你就会发现你的Student表中多了一个number字段。

现在存储的版本号是2了。如果你想升级成3,只要创建3_XXXXX.sql文件,在sql文件中写相应操作的sql语句就可以了。4、5、6等以此类推,也是使用时间戳来代替。
fmdb的升级方式和coredata的升级方式有点类似,fmdb是创建相应版本的sql文件,coredata是创建相应版本的XXXX.xcdatamodeld。

注意:其实升级的主要方式是逐级升级,如果当前版本是2,现在要升级到版本5,这样他会先升级到3,再从3升级到4,最后在升级到最终的版本5.

schema_migrations表中记录的是你已经迁移成功的数据库版本和对应的sql文件

第二种方式:使用自定义类的形式进行迁移。先关联FMDBMigrationManager,再创建自定义类型,并且遵循FMDBMigrationManager协议,最后把创建的自定义的类型加入到FMDBMigrationManager中,升级。

创建一个类,需要遵循FMDBMigrating协议

@interface StudentMigration : NSObject<FMDBMigrating>
@property (nonatomic, readonly) NSString *name;
@property (nonatomic, readonly) uint64_t version;
- (instancetype)initWithName:(NSString *)name  version:(uint64_t)version executeUpdateArray:(NSArray *)updateArray;- (BOOL)studentrMigrateDatabase:(FMDatabase *)database error:(out NSError *__autoreleasing *)error;@end
@interface StudentMigration()
@property(nonatomic,copy)NSString * mName;
@property(nonatomic,assign)uint64_t mVersion;
@property(nonatomic,strong)NSArray * mUpdateArray;
@end@implementation StudentMigration
- (instancetype)initWithName:(NSString *)name version:(uint64_t)version executeUpdateArray:(NSArray *)updateArray
{if (self=[super init]) {_mName=name;_mVersion=version;_mUpdateArray=updateArray;}return self;
}
- (NSString *)name
{return _mName;
}
- (uint64_t)version
{return _mVersion;
}
- (BOOL)studentMigrateDatabase:(FMDatabase *)database error:(out NSError *__autoreleasing *)error
{for(NSString * updateStr in _mUpdateArray){[database executeUpdate:updateStr];}return YES;
}@end

然后将自定义的对象添加进入FMDBMigrationManager类里面,进行升级操作
注意:
 1、这里不需要创建很多的自定义类来升级数据库,只需要创建一个自定义类来实现数据库的升级。通过不同的自定义对象,来实现数据库的升级。比如下面的代码中定义了migrationOne和migrationTwo对象来实现了2个版本的升级。如果需要升级版本3,你需要在定义一个migrationThree对象,version传递3就可以了。
 2、migrationOne和migrationTwo对象中的版本号(version)需要递增。executeUpdateArray这个数组可以传递多个升级语句。Name是每个版本的升级描述。

    //oldPath是要升级的数据库的地址NSString *oldPath = KFMDBName;FMDBMigrationManager * manager = [FMDBMigrationManager managerWithDatabaseAtPath:oldPath migrationsBundle:[NSBundle mainBundle]];StudentMigration * migrationOne=[[UserMigration alloc]initWithName:@"新创建Student表" version:1 executeUpdateArray:@[@"create table Student(name text,age integer,nick text)"]];[manager addMigration:migrationOne];StudentMigration * migrationTwo=[[UserMigration alloc]initWithName:@"Student表新增number" version:2 executeUpdateArray:@[@"alter table Student add number text"]];[manager addMigration:migrationTwo];BOOL resultState=NO;NSError * error=nil;if (!manager.hasMigrationsTable) {resultState=[manager createMigrationsTable:&error];}//UINT64_MAX 表示升级到最高版本resultState=[manager migrateDatabaseToVersion:UINT64_MAX progress:nil error:&error];

一个对象可以执行多个sql语句:

//一个对象执行升级多个SQL语句StudentMigration * migrationThree=[[UserMigration alloc]initWithName:@"新创建teacher表,Student表新增Sex" version:3 executeUpdateArray:@[@"alter table Student add Sex text",@"create table teacher(name text,age integer,nick text)"]];[manager addMigration:migrationThree];

二、遇到的问题
1、FMDB迁移数据的问题
a、一定要明确每个版本的版本号,不然会造成数据升级失败,程序奔溃

比如:之前升级了版本1、2、4、5版本了,这时候你的版本号添加的版本号是3,版本3中添加的一个字段number字段。可是,你的版本号不是逐级递增的,这样就会导致版本3迁移失败,还是原来的版本5,其他类中在使用number这个字段发现该字段并不存在。

三、参考文件

FMDB数据库的迁移 ------https://www.jianshu.com/p/736b00b3a1e1

FMDBMigrationManager下载,使用说明 https://github.com/layerhq/FMDBMigrationManager/blob/master/README.md

四、结束语

本文是介绍了FMDB数据库二种升级的方式,如果有侵权或者写的不好的地方,请留言,我会及时修改。谢谢大家。

FMDB数据库的升级相关推荐

  1. mysql数据库可以升级吗_[数据库]MySQL升级

    [数据库]MySQL升级 0 2016-08-16 22:00:18 MySQL的升级相对来说还是比较简单的. 它支持两种方式的升级: 原地升级(In-place Upgrade) 关闭数据库,替换旧 ...

  2. ios mysql数据库查询语句_ios fmdb数据库查询语句

    iOS开发数据库篇-FMDB简单介绍 iOS开发数据库篇-FMDB简单介绍 一.简单说明 1.什么是FMDB FMDB是iOS平台的SQLite数据库框架 FMDB以OC的方式封装了SQLite的C语 ...

  3. oracle mysql增量迁移_深入浅出XTTS:Oracle数据库迁移升级利器

    内容来源:2017年3月11日,新炬网络高级工程师杨光在"DBAplus北京数据库技术沙龙"进行<深入浅出XTTS:Oracle数据库迁移升级利器>演讲分享.IT 大咖 ...

  4. Android版本升级同时Sqlite数据库的升级及之前数据的保留-转

    http://www.cnblogs.com/wang340/archive/2013/05/06/3063135.html http://www.eoeandroid.com/forum.php?m ...

  5. XTTS,又一个值得你重视的Oracle数据库迁移升级利器

    嘉宾简介 杨志洪 [DBA+社群]上海发起人 数据管理专家.Oracle ACE.OCM. SHOUG/ZJOUG核心成员.DAMA会员/CCF会员,译著<Oracle核心技术>. 在Or ...

  6. his系统服务器选择,我院完成HIS服务器及数据库的升级改造

    随着我院信息化建设的发展,医院HIS服务器7×24h满负荷运转,运行压力非常大,常常出现门诊高峰期收费响应慢.报表数据读等待时间长的现象,严重影响我院工作效率. 为解决这一难题,在院领导的支持下开始进 ...

  7. Pre-Upgrade Utility---下载并运行Oracle数据库预升级实用程序 (文档 ID 1577379.1)

    如何下载并运行Oracle数据库预升级实用程序 (文档 ID 1577379.1) 文档内容 目标 脚本来源 解决方案 脚本指导 下载并安装说明 请参阅下表以确定您需要的pre-upgrade脚本的版 ...

  8. FMDB - 数据库操作

    iOS中原生的SQLite API在使用上相当不友好,在使用时,非常不便.于是,就出现了一系列将SQLite API进行封装的库,例如FMDB.PlausibleDatabase.sqlitepers ...

  9. Oracle图书馆借阅管理数据库,图书馆管理系统Oracle数据库平台升级研究

    随着现在计算机网络的发展,数字化图书凭着其发行的速度快.借阅的方便,并且没有时间和空间的限制逐渐成为未来图书馆发展中的一种趋势.我图书馆使用了汇文文献信息服务系统,该系统是江苏省教委资助,江苏省高校合 ...

最新文章

  1. javascript优化_如何通过使用服务人员来优化JavaScript应用
  2. mysql jdbc tomcat_Tomcat+MySql+jdbc
  3. history的详解与使用
  4. 使用JMeter录制手机App脚本
  5. 【测试】ESP32天线信号强度比较,小龟小车A2天线esp32cam板载外置天线测试数据...
  6. 迷你世界显示未连接服务器成功,迷你世界登录未成功是什么意思 | 手游网游页游攻略大全...
  7. 刚安装玩mysql如何登录不了_解决启用GTID binlog新安装完的MySQL提示无法登录
  8. 经济师计算机考试取消,2019年经济师考试计算机机考答题要求及说明
  9. beyond compare 4.2.9桌面右键集成的问题修复
  10. lua与python结合_从Python到Lua
  11. 使用ConfigurationManager来写自己的配置文件
  12. 基于单片机的表决器(七人)系统设计(#0496)
  13. Android9能用的flash播放器,flash player安卓4.4_安卓flash player 9.0_安卓adobe flash player 9...
  14. 利用python下载视频
  15. QML 语法(Syntax)
  16. 是java运行时环境的缩写,java运行环境的英文缩写
  17. Java内存模型中的happen-before是什么?
  18. NXP JN5169 波特率配置方案
  19. 2021年中国智能驾驶行业研究报告
  20. virtualbox和Hyperv

热门文章

  1. SDR技术原理解析 USRP收发原理
  2. 特征工程之特征分箱(决策树分箱、卡方分箱、bestks以及评价标准WOE和IV)
  3. 北京高级软件需求分析师培训招生!
  4. 用机器学习计算工作技能匹配度
  5. 凸优化(convex optimization)第二讲:convex set
  6. 设置360浏览器的背景色为绿豆色或护眼色
  7. veins中实现rsu与车辆通信
  8. CF975C Valhalla Siege 题解
  9. 建立ftp 服务器连接
  10. 符号的英文读法(转)