FMDB数据迁移
https://www.jianshu.com/p/736b00b3a1e1
2017.08.25 15:44* 字数 500 阅读 1474评论 0喜欢 4
公司项目中,一般都需要做数据持久化,我们使用的是FMDB操作Sqlite,正常使用过程中,没有什么问题,但是一旦需求改了,数据结构发生变化,需要增加字段的时候,就必须要考虑数据迁移的问题,原来用了种很不好的处理方式,每次版本升级,就删除本地数据库,这种方式很不友好,于是考虑如何优化数据库的迁移操作.
因为项目用的是FMDB,所以数据迁移就用这个FMDBMigrationManager工具类,FMDBMigrationManager 是与FMDB结合使用的一个第三方,可以记录数据库版本号并对数据库进行数据库升级等操作。
操作步骤
1.新建一个Xcode的项目,并集成FMDB和FMDBMigrationManager(建议使用cocoapods,这里不再多说.)
2.创建一个数据库,这里是我们将要进行升级操作的数据库。
- (void)testCreatSqlite{
NSString *filePath = [self getPath];
FMDatabase * db=[FMDatabase databaseWithPath:filePath];
_db=db;
if ([_db open]) {
//创建一个名为Student的表
BOOL result = [_db executeUpdate:@"CREATE TABLE if not exists Book (id integer primary key autoincrement, bookNumber integer, bookName text, authorID integer, pressName text);"];
if (result) {
NSLog(@"创表成功");
}else{
NSLog(@"创表失败");
}
//存入十个水浒传
for (int i=0; i<10; i++) {
NSString *bookName = [NSString stringWithFormat:@"水浒传%d",i+1];
NSString *bookNumber = [NSString stringWithFormat:@"数量%d",i+1];
[_db executeUpdate:@"INSERT INTO book (bookName,bookNumber) VALUES (?,?)",bookName,bookNumber];
}
}
[_db close];
}
创建成果后数据结构如下所示:
3.将要进行升级操作的数据库与FMDBMigrationManager关联起来
//[self getPath]是数据库路径
FMDBMigrationManager * manager=[FMDBMigrationManager managerWithDatabaseAtPath:[self getPath] migrationsBundle:[NSBundle mainBundle]];
4.创建迁移表
BOOL resultState=NO;
NSError * error=nil;
if (!manager.hasMigrationsTable) {
resultState=[manager createMigrationsTable:&error];
}
resultState=[manager migrateDatabaseToVersion:UINT64_MAX progress:nil error:&error];
控制台输出:
2017-08-25 11:28:19.358 FMDBMigrationManagerDemo[5508:149471] Origin Version: 0
2017-08-25 11:28:19.358 FMDBMigrationManagerDemo[5508:149471] Current version: 0
2017-08-25 11:28:19.359 FMDBMigrationManagerDemo[5508:149471] All migrations: (
"<Migration: 0x608000038620>"
)
2017-08-25 11:28:19.359 FMDBMigrationManagerDemo[5508:149471] Applied versions: (
0
)
2017-08-25 11:28:51.474 FMDBMigrationManagerDemo[5508:149471] Pending versions: (
)
执行完该语句,再去查看数据库,会发现多了一个表 schema_migrations

这个表就是用来存储版本号的,目前表中的版本号(version)为0。
5.使用自定义类的形式升级,定义一个新的类:Migration,遵循FMDBMigrating协议


使用方法也很简单,将自定义类对象添加进manager即可。
Migration * migration_2=[[Migration alloc]initWithName:@"Book" andVersion:2 andExecuteUpdateArray:@[@"alter table Book add book_email text"]];//给User表添加email字段
Migration * migration_3=[[Migration alloc]initWithName:@"Book" andVersion:3 andExecuteUpdateArray:@[@"alter table Book add book_address text"]];
[manager addMigration:migration_2];
[manager addMigration:migration_3];
6.加入一个新增数据库的字段(项目中常用的升级操作就是增加数据库字段)
完整的新增数据库字段的代码
- (void)testupdatePrivateMsg{
NSString *filePath = [self getPath];
NSLog(@"-----filePath:%@",filePath);
FMDBMigrationManager * manager=[FMDBMigrationManager managerWithDatabaseAtPath:filePath migrationsBundle:[NSBundle mainBundle]];
Migration * migration_1=[[Migration alloc]initWithName:@"Book" andVersion:1 andExecuteUpdateArray:@[@"alter table Book add book_email text"]];//给User表添加email字段
Migration * migration_2=[[Migration alloc]initWithName:@"Book" andVersion:2 andExecuteUpdateArray:@[@"alter table Book add book_address text"]];
[manager addMigration:migration_1];
[manager addMigration:migration_2];
BOOL resultState=NO;
NSError * error=nil;
if (!manager.hasMigrationsTable) {
resultState=[manager createMigrationsTable:&error];
}
resultState=[manager migrateDatabaseToVersion:UINT64_MAX progress:nil error:&error];
}
执行完代码后,查看数据库,发现已经多了一个book_email和book_address的字段了.
1-3.png

如果以后还想升级,再加入一个新的自定义对象即可, 注意!!!
版本号一定要保持递增.
作者:翀鹰女孩
链接:https://www.jianshu.com/p/736b00b3a1e1
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
FMDB数据迁移的更多相关文章
- 【SQLServer】记一次数据迁移-标识重复的简单处理
汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 今天在数据迁移的时候因为手贱遇到一个坑爹问题,发来大家乐乐,也传授新手点经验 迁移惯用就 ...
- Entity Framework Code First Migrations--EF 的数据迁移
1. 为了演示方便,首先新建一个控制台项目,然后添加对entityframework的引用 使用nuget控制台执行: Install-Package EntityFramework 2.新建一个实体 ...
- mssql与mysql 数据迁移
概要: mssql向mysql迁移的实例,所要用到的工具bcp和load data local infile. 由于订单记录的数据是存放在mssql服务器上的,而项目需求把数据迁移到mysql ser ...
- 重置EntityFramework数据迁移到洁净状态
前言 翻译一篇有关EF数据迁移的文章,以备日后所用,文章若有翻译不当的地方请指出,将就点看,废话少说,看话题.[注意]:文章非一字一句的翻译,就重要的问题进行解释并解决. 话题引入 无法确定这种场景是 ...
- MySQL数据迁移到SQL Server
数据迁移的工具有很多,基本SSMA团队已经考虑到其他数据库到SQL Server迁移的需求了,所以已经开发了相关的迁移工具来支持. 此博客主要介绍MySQL到SQL Server数据迁移的工具:SQL ...
- MySQL数据迁移到MSSQL-以小米数据库为例-测试828W最快可达到2分11秒
这里采用.NET Framework 4.0以上版本中新出现的 ConcurrentQueue<T> 类 MSDN是这样描述的: ConcurrentQueue<T> 类是一个 ...
- 从零自学Hadoop(16):Hive数据导入导出,集群数据迁移上
阅读目录 序 导入文件到Hive 将其他表的查询结果导入表 动态分区插入 将SQL语句的值插入到表中 模拟数据文件下载 系列索引 本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并 ...
- 从零自学Hadoop(17):Hive数据导入导出,集群数据迁移下
阅读目录 序 将查询的结果写入文件系统 集群数据迁移一 集群数据迁移二 系列索引 本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 文章是哥(mephis ...
- SQL SERVER几种数据迁移/导出导入的实践
SQLServer提供了多种数据导出导入的工具和方法,在此,分享我实践的经验(只涉及数据库与Excel.数据库与文本文件.数据库与数据库之间的导出导入). (一)数据库与Excel 方法1: 使用数据 ...
随机推荐
- 通过POI实现上传EXCEL的批量读取数据写入数据库
最近公司新增功能要求导入excel,并读取其中数据批量写入数据库.于是就开始了这个事情,之前的文章,记录了上传文件,本篇记录如何通过POI读取excel数据并封装为对象上传. 上代码: 1.首先这是一 ...
- PCC值average pearson correlation coefficient计算方法
1.先找到task paradise 的m1-m6: 2.根据公式Dy=D1* 1/P*∑aT ,例如 D :t*k1 a:k2*k1: Dy :t*k2 Dy应该有k2个原子,维度是t: 3.依 ...
- 【笔记3-用户模块】从0开始 独立完成企业级Java电商网站开发(服务端)
数据表结构设计 关系设计 为什么不用外键? 分库分表有外键会非常麻烦,清洗数据也很麻烦.数据库内置触发器也不适合采用. 查业务问题的后悔药--时间戳 create_time 数据创建时间 update ...
- Steam 游戏 《Sudoku Universe(数独宇宙)》、《Sudoku Killer(数独杀手)》、《Sudoku Jigsaw(数独拼图)》数字位置解析 ---------C# 数独程序解析(2020年寒假小目标11)
日期:2020.02.11 博客期:151 星期二 今天,准备肝一个 C# 的数独读写工具(汇编语言也在努力学习命令方法中...),这三个游戏我早就买下了,一直放在 Steam 库里积灰,看着它的成就 ...
- python中安装下载超时,下载不了安装包
python3 -m pip install scapy 执行上面命令报错,下载超时,下载不了安装包 Collecting scapy WARNING: Retrying (Retry(total=4 ...
- FastDFS上传文件访问url地址直接下载
fdfs 存储节点storage安装nginx,修改nginx配置文件 location ~/group[1-9]/M00 { if ( $query_string ~* ^(.*)paramete ...
- 14. 深入解析Pod对象(一)
14. 深入解析Pod对象(一) """ 通过前面的讲解,大家应该都知道: Pod,而不是容器,它是 Kubernetes 项目中的最小编排单位.将这个设计落实到 API ...
- pdf.js的使用(1) 站在巨人的肩膀上纯干货分享,没有华丽的词藻
以下是我在实际项目开发中的过程分享 前端是:vue+jsp 1.首先下载pdf.js(怎么下可以去百度),实在不会就私我,我发给你 1.1展示一哈我下载下来的pdf.js的目录结构 1.2接下来可 ...
- 再次立个flag
今天2019.9.18 从上次迷茫到现在,差不多过去快一年了. 准确点是 442 天 我顺便大概看了一下上次迷茫时期的日志,总觉的不可思议.上次是毕业大概几个月,到目前其实也没多久,但是我变了.. ...
- System.getProperty() 获取系统变量
例:获取用户当前的工作目录 String CONFPREFIXURL = System.getProperty("user.dir"); System.out.println(CO ...