博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS SQLite 数据库迁移
阅读量:6669 次
发布时间:2019-06-25

本文共 3396 字,大约阅读时间需要 11 分钟。

本文转载至 http://www.jianshu.com/p/c19dd08697bd

最近不得不考虑关于数据库迁移的问题,原先用了种很不好的处理方式(每次版本升级就删除本地数据库,太傻),于是开始考虑下如何迁移数据库。

项目使用的  ,除了使用 Core Data 外,这就是最好的了(最近好像又有了个 )。

在  介绍页面,发现了  ,大喜。

看了半天文档,捣鼓了半天才弄出来,一步步整理下。

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: ( "
" ) 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 了下发现。

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 命令只能允许用户重命名表或者添加新列,不能重命名列或者删除列或者删除约束。

你可能感兴趣的文章
JavaScript DOM 编程艺术(第2版)读书笔记(5)
查看>>
工作流开发使用问题汇总
查看>>
常用Build-in Keywords
查看>>
leetcode — edit-distance
查看>>
剑指offer 之 memcpy
查看>>
第一次作业:基于Linux进程模型的分析
查看>>
贝叶斯学习1
查看>>
CSS 和 JS 动画哪个更快
查看>>
.NET中的六个重要概念:栈、堆、值类型、引用类型、装箱和拆箱
查看>>
正则表达式匹配html标签里面的内容
查看>>
C#学习笔记(六)抽象类 访问限制关键字 委托 事件
查看>>
C# 如何发送Http请求
查看>>
[转]我省多元化军民融合金融创新服务体系正加快形成
查看>>
JDBC
查看>>
Eclipse文件首部自动加 作者时间
查看>>
The C Programming Language(K&R) 扣细节随记
查看>>
window.open()的具体使用方法
查看>>
【IntelliJ IDEA】idea显示工具栏
查看>>
mac 下 android studio 的离线gradle极速配置方法
查看>>
Android Studio中Gradle sync failed
查看>>