iOS 数据库迁移

来源:互联网 发布:四代目大和辰之 淘宝 编辑:程序博客网 时间:2024/06/14 11:52

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?: YES2015-04-20 20:50:19.036 YMFMDatabase[12654:1326201] Origin Version: 201504201700449402015-04-20 20:50:19.036 YMFMDatabase[12654:1326201] Current version: 201504201700449402015-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 表,里面含有 idname 字段。以及 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 了下发现[答案](http://stackoverflow.com/questions/8442147/how-to-delete-or-add-column-in-sqlite)。>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`` 命令只能允许用户重命名表或者添加新列,不能重命名列或者删除列或者删除约束。


阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 win10怎么进入bios设置界面 阜阳界首 界首市 界首论坛 界首高铁 界首镇 界首邮编 界首市邮编 安徽界首 花店 界首 界首电大 界首论坛网 界首吧 界首市属于哪个市 合肥到界首汽车时刻表 界首第一首富王峥照片 界首一中校花魏晗 界首房价2019年价格 界首骨科医院 界首市人民医院 界首合肥汽车 界首属于哪个省 畏怯的意思 无所畏惧 畏惧的意思 畏惧的拼音 畏惧拼音 皇后无所畏惧初云之初 无所畏惧意思 皇后无所畏惧txt 皇后无所畏惧萌不萌 无所畏惧什么意思 无所畏惧英文 皇后无所畏惧初云 无所畏惧图片 不畏惧艰难险阻的成语 无所畏惧的意思 皇后无所畏惧 初云之初 皇后她无所畏惧 毫不畏惧的意思