iOS SQLite 数据库迁移
本文转载至 http://www.jianshu.com/p/c19dd08697bd
最近不得不考虑关于数据库迁移的问题,原先用了种很不好的处理方式(每次版本升级就删除本地数据库,太傻),于是开始考虑下如何迁移数据库。
项目使用的 FMDB ,除了使用 Core Data 外,这就是最好的了(最近好像又有了个realm )。
在 FMDB 介绍页面,发现了 FMDBMigrationManager ,大喜。
看了半天文档,捣鼓了半天才弄出来,一步步整理下。
0.安装 FMDBMigrationManager
Podfile 文件:
platform :ios, "7.0"
pod 'FMDB'
pod 'FMDBMigrationManager'
使用pod install命令安装
1.FMDBMigrationManager 创建数据库
FMDBMigrationManager *manager = [FMDBMigrationManager managerWithDatabaseAtPath:[YMDatabaseHelper databasePath] migrationsBundle:[NSBundle mainBundle]];
其中[YMDatabaseHelper databasePath]是数据库路径
2.创建迁移表
BOOL resultState = [manager createMigrationsTable:&error];
创建的迁移表名称为:schema_migrations
3.创建 .sql 文件
该文件用来存储每次升级使用的 SQL 语句。
FMDBMigrationManager 建议我们使用时间戳来作为版本号,使用下面的命令生成一个文件:
touch "`ruby -e "puts Time.now.strftime('%Y%m%d%H%M%S%3N').to_i"`"_CreateMyAwesomeTable.sql
我生成的文件名为:20150420170044940_CreateMyAwesomeTable.sql,其中20150420170044940 为迁移的版本号标识。
我们在 20150420170044940_CreateMyAwesomeTable.sql文件中创建一个用户表,写入:
CREATE TABLE User(
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
name TEXT
);
4.迁移函数
FMDBMigrationManager *manager = [FMDBMigrationManager managerWithDatabaseAtPath:[YMDatabaseHelper databasePath] migrationsBundle:[NSBundle mainBundle]];
BOOL resultState = NO;
NSError *error = nil;
if (!manager.hasMigrationsTable) {
resultState = [manager createMigrationsTable:&error];
}
resultState = [manager migrateDatabaseToVersion:UINT64_MAX progress:nil error:&error];//迁移函数
NSLog(@"Has `schema_migrations` table?: %@", manager.hasMigrationsTable ? @"YES" : @"NO");
NSLog(@"Origin Version: %llu", manager.originVersion);
NSLog(@"Current version: %llu", manager.currentVersion);
NSLog(@"All migrations: %@", manager.migrations);
NSLog(@"Applied versions: %@", manager.appliedVersions);
NSLog(@"Pending versions: %@", manager.pendingVersions);
UINT64_MAX 表示把数据库迁移到最大的版本
运行项目,打印出如下内容:
2015-04-20 20:50:19.033 YMFMDatabase[12654:1326201] Has `schema_migrations` table?: YES
2015-04-20 20:50:19.036 YMFMDatabase[12654:1326201] Origin Version: 20150420170044940
2015-04-20 20:50:19.036 YMFMDatabase[12654:1326201] Current version: 20150420170044940
2015-04-20 20:50:19.037 YMFMDatabase[12654:1326201] All migrations: (
"<FMDBFileMigration: 0x17003b4c0>"
)
2015-04-20 20:50:19.037 YMFMDatabase[12654:1326201] Applied versions: (
20150420170044940
)
2015-04-20 20:50:19.038 YMFMDatabase[12654:1326201] Pending versions: (
)
用 iFunBox 查看下是不是创建了一个 User 表,里面含有 id、name 字段。以及 FMDBMigrationManager 生成的 schema_migrations 表。
5.创建第二个 .sql 文件
先用上方命令:
touch "`ruby -e "puts Time.now.strftime('%Y%m%d%H%M%S%3N').to_i"`"_CreateMyAwesomeTable.sql
生成,我生成的是:20150420170557221_CreateMyAwesomeTable.sql。
第二个 sql 文件,里面创建一个新表名字为 Grouping,为原先的 User 表添加邮箱字段:email。.sql 文件修改如下:
CREATE TABLE Grouping(
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
name TEXT
);
ALTER TABLE User ADD email TEXT;
6.创建第三个 .sql 文件
生成同上,文件内容是为 Grouping 表添加备注字段 remark:
文件内容:
ALTER TABLE Grouping ADD remark TEXT;
OK,直接运行项目,看看是不是创建了 Grouping 表,里面含有id,name,remark字段,以及 User 表里面是不是添加了 email 字段。
7.遇到的问题
中间我自己做 Demo 时,试图删除表中的某列,比如删除 User 表中的 name 列,但是不能成功,Google 了下发现答案。
SQLite supports a limited subset of ALTER TABLE. The ALTER TABLE command in SQLite allows the user to rename a table or to add a new column to an existing table. It is not possible to rename a column, remove a column, or add or remove constraints from a table.
解释下:就是说 SQLite 对 ALERT TABLE 命令受限制,SQLite 中的 ALERT TABLE 命令只能允许用户重命名表或者添加新列,不能重命名列或者删除列或者删除约束。
iOS SQLite 数据库迁移的更多相关文章
- iOS sqlite数据库实现(转)
转载自:http://www.cnblogs.com/macroxu-1982/archive/2012/10/01/2709960.html 1 实现过程添加libsqlite3组件 选择项目后,在 ...
- iOS - SQLite 数据库存储
1.SQLite 数据库 SQLite 是一种轻型的嵌入式数据库,安卓和 iOS 开发使用的都是 SQLite 数据库.它占用资源非常低,在嵌入式设备中,可能需要几百 K 的内存数据就够了.他的处理速 ...
- 【转】iOS - SQLite 数据库存储
本文目录 1.SQLite 数据库 2.iOS 自带 SQLite 的使用 3.fmdb 的使用 4.fmdb 多线程操作 5.其他 SQLite 的第三方封装库 回到顶部 1.SQLite 数据库 ...
- iOS sqlite数据库图像化查看
问题描述:在xocde上用sqlite数据库的时候,因为没有图形化界面,有些时候很难看出自己设计的数据库是否有问题,比如我刚上手sqlite数据库设计id为自增长时,很自然的用了identify(1, ...
- IOS sqlite数据库增删改查
1.简单介绍 简单封装sqlite数据库操作类 BaseDB 用于完毕对sqlite的增删改查.使用前先导入libsqlite3.0.dylib库 2.BaseDB.h // // BaseDB.h ...
- iOS: sqlite数据库的基本操作
介绍: sqlite3(3是版本)是本地系统中的一个小型数据库,因为它没有在数据维护和安全上做过多的操作,所以它存储处理数据时,非常简单方便,但是它是不安全和不可靠的,如果一旦误操作删除了数据,是没有 ...
- 转:ios Sqlite数据库增删改查基本操作
研究了几天的数据库,终于把它给搞出来了.Sqlite是ios上最常用的数据库之一,大家还是有必要了解一下的.这是仿照网上的一个例子做的,有些部分写的不好,我稍作了修改,以讲解为主,主要让大家能够明白如 ...
- ios sqlite数据库操作
@interface MyViewController () { // 数据库实例,代表着整个数据库 sqlite3 *_db; } @end @implementation MyViewContro ...
- SQLite数据库迁移MySQL(MariaDB)完整步骤
第一步(SQLite导出数据库): 命令方式导出数据库 > .output d:/data/lagou.sql //导出路径及文件名 > .dump //开始导出 修改lagou.sql文 ...
随机推荐
- android textview使用ttf字体显示图片
最近在研究一个组件时,发现使用textview显示了一张图片,原以为android原生支持,仔细研究了下,是用ttf字体实现的,记录下 网上的介绍文章很多,这里就不啰嗦了,链接 https://www ...
- json与xml数据输出类
class Response { /** * 按json方式输出通信数据 * @param integer $code 状态码 * @param string $message 提示信息 * @par ...
- 网站SSL证书在线检测
网站SSL证书在线检测 http://web.chacuo.net/netsslcheck OpenSSL命令行工具的证书操作 http://blog.csdn.net/a351945755/arti ...
- caffe solver 配置详解
caffe solver通过协调网络前向推理和反向梯度传播来进行模型优化,并通过权重参数更新来改善网络损失求解最优算法,而solver学习的任务被划分为:监督优化和参数更新,生成损失并计算梯度.caf ...
- GitHub超全机器学习工程师成长路线图,开源两日收获3700+Star!【转】
作者 | 琥珀 出品 | AI科技大本营(ID:rgznai100) 近日,一个在 GitHub 上开源即收获了 3700+ Star 的项目,引起了营长的注意.据介绍,该项目以 TensorFlow ...
- vs2010编译错误(报错:LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏)
报错:LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏 1> 这段时间忙于看文献,没用过VS了. 今天用着用着就报错了: LINK : fat ...
- sed 多行处理详细总结
在正常情况下,sed将待处理的行读入模式空间,脚本中的命令就一条接着一条的对该行进行处理,直到脚本执行完毕,然后该行被输出,模式空间请空:然后重复刚才的动作,文件中的新的一行被读入,直到文件处理完备. ...
- Spark操作:Aggregate和AggregateByKey
1. Aggregate Aggregate即聚合操作.直接上代码: import org.apache.spark.{SparkConf, SparkContext} object Aggregat ...
- cache line 伪共享
https://blog.csdn.net/qq_27680317/article/details/78486220认识CPU Cache CPU Cache概述 随着CPU的频率不断提升,而内存的访 ...
- 〖Android〗arm-linux-androideabi-gdb报 libpython2.6.so.1.0: cannot open shared object file错误的解决方法
执行: prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.6/bin/arm-linux-androideabi-gdb out/target/p ...