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文 ...
随机推荐
- idea jsp html 空白页的问题
摘要 最近没事儿瞎折腾java web,在idea中,突然发现无法显示页面了. 问题 为什么会出现这个问题? 接触了过滤器的内容,然后在项目中添加了这样的一个过滤器,用来对post过来的数据进行ut8 ...
- AngualrJS中制作一个有关菜单的Directive
通常我们这样写一个菜单: <ul> <li data-ng-class="{'active': highlight('/orders')}"> <a ...
- android 布局文件 ScrollView 中的 listView item 显示不全解决方案
import android.content.Context;import android.util.AttributeSet;import android.widget.ListView; /** ...
- Intellij IDEA 通过数据库表逆向生成带注释的实体类文件超级详细步骤,附详细解决方案
参考:https://blog.csdn.net/qq_34371461/article/details/80571281 https://blog.csdn.net/mqchenrong/arti ...
- Zookeeper单机伪集群
Zookeeper单机伪集群 1.配置 zookeeper下载地址:http://apache.mirrors.lucidnetworks.net/zookeeper/ 可以选择需要的版本,我下载的是 ...
- KVM虚拟化管理 virt manager常用操作
部分涉及到Linux.Nginx.tomcat.MySQL等的点滴操作记录,时间长了,就忘掉了,偶尔整理一下操作的history,就此简要备份一下: [原][BG]-一次虚拟化环境实践简要记录: ht ...
- 启动Jupyter Notebook
按照图所示,在命令下输入ipython notebook 即可启动Jupyter. 启动后的效果:
- 【Windows】Windows中解析DOS的DIR命令使用
总结一下cmd中的dir命令的用法 64位win10系统上,打印帮助文档. D:\test>dir /? 显示目录中的文件和子目录列表. DIR [drive:][path][filename] ...
- connect by prior start with 语句实现树递归查询[百度经验]
TART WITH CONNECT BY PRIOR子句实现递归查询 TART WITH CONNECT BY PRIOR这个语法主要用于查询数据包中的树型结构关系.先看下原始数据时怎么样的吧! 表中 ...
- Win10 设置窗口背景色
Win10 的窗口背景色不能像Win7那样通过修改Windows的"窗口"配置来生效,只能是通过修改注册表的信息来修改Win10的窗口色. 1. 通过注册表来修改默认的窗口背景色( ...