本人在这里重要强调一下!!!

看这里,看这里,看这里,重要的事说三遍。

本人在项目开发中,由于需求问题,不得不对已经建立好的数据库进行修改(添加字段),我就很随意的直接添加了对一个的字段,运行一下,数据库报错打印出来好多内容(具体打印的东西没记录,意思就是找不到我刚才添加的字段),无奈我删掉app重新运行,居然好了,我刚才添加的字段也正常可以用了。所以我就没在意很多,知道项目即将上线,问题来,老大告诉我这样是根本不行的,用户单纯的升级app还是无法用到这个字段的,只能删除重新下载。。。。。。。。我凌乱了,原来已经建立好的数据库不能直接的添加字段,必须升级,升级,升级!!!

上面是我惨痛的教训。下面我就总结一下,数据升级的知识。

1.你必须用NSUserDefaults存一个当前数据库的版本号:

[[NSUserDefaults standardUserDefaults] registerDefaults:@{@"DBVersion":@0}];

2.在每次创建数据库(如果所创建的数据存在,就不会重新创建,这就是为什么必须数据升级)时,我们要判断当前数据库版本号和最新的数据库版本号是都一致,

NSInteger currVersion = [UserDefaults integerForKey:VersionKey];

BOOL fileExist = [[NSFileManager defaultManager] fileExistsAtPath:DBPath];//数据是否存在

if (currVersion < DBVersion && fileExist) {//DBVersion最新的版本号

//需要升级

_dbQueue = [FMDatabaseQueue databaseQueueWithPath:DBPath];

[self upgradeDB];

}

else {

[self createDB];

[UserDefaults synchronize];

}

[UserDefaults setInteger:DBVersion forKey:VersionKey];//保存最新数据库版本号

- (void)upgradeDB {

__block BOOL isRollBack = NO;

[[FMDatabaseQueue databaseQueueWithPath:DBPath] inDatabase:^(FMDatabase *db) {

[db beginTransaction];

@try {

[db executeUpdate:@"CREATE TEMPORARY TABLE comicRead_backup(comicId INTEGER, chapterId INTEGER, pageIndex INTEGER, updateTime INTEGER)"];

[db executeUpdate:@"INSERT INTO comicRead_backup SELECT comicId,chapterId,pageIndex,updateTime FROM comicRead"];

[db executeUpdate:@"DROP TABLE comicRead"];

//浏览记录,却掉之前的comicId的unique约束

NSString *comicReaderSql = @"CREATE TABLE IF NOT EXISTS comicRead (\

comicId  INTEGER DEFAULT 0,\

chapterId  INTEGER DEFAULT 0,\

pageIndex  INTEGER DEFAULT 0,\

updateTime  INTEGER DEFAULT 0)";

[db executeUpdate:comicReaderSql];

[db executeUpdate:@"INSERT INTO comicRead SELECT comicId,chapterId,pageIndex,updateTime FROM comicRead_backup"];

[db executeUpdate:@"DROP TABLE comicRead_backup"];

[db executeUpdate:@"ALTER TABLE comicRead ADD COLUMN cover TEXT"];

[db executeUpdate:@"ALTER TABLE comicRead ADD COLUMN comic_name TEXT"];

[db executeUpdate:@"ALTER TABLE comicRead ADD COLUMN chapter_name TEXT"];

[db executeUpdate:@"ALTER TABLE comicRead ADD COLUMN isLocal INTEGER default 0"];

[db executeStatements:@"CREATE UNIQUE INDEX IF NOT EXISTS comicReadUniqueIndex ON comicRead(comicId,isLocal)"];

[db executeUpdate:@"UPDATE comicRead SET isLocal=1"];

}

@catch (NSException *exception) {

isRollBack = YES;

[db rollback];

}

@finally {

if (!isRollBack) {

[db commit];

[UserDefaults setInteger:2 forKey:VersionKey];

[UserDefaults synchronize];

debugLog(@"upgradeTo_2 success");

[self upgradeDB];

}

}

}];

}

iOS---FMDB数据升级的更多相关文章

  1. iOS FMDB的使用(增,删,改,查,sqlite存取图片)

    iOS FMDB的使用(增,删,改,查,sqlite存取图片) 在上一篇博客我对sqlite的基本使用进行了详细介绍... 但是在实际开发中原生使用的频率是很少的... 这篇博客我将会较全面的介绍FM ...

  2. IOS开发数据存储篇—IOS中的几种数据存储方式

    IOS开发数据存储篇—IOS中的几种数据存储方式 发表于2016/4/5 21:02:09  421人阅读 分类: 数据存储 在项目开发当中,我们经常会对一些数据进行本地缓存处理.离线缓存的数据一般都 ...

  3. iOS开发 数据缓存-数据库

    iOS中数据存储方式 Plist(NSArray\NSDictionary) Preference(偏好设置\NSUserDefaults) NSCoding (NSKeyedArchiver\NSk ...

  4. iOS 15 Beta升级卡死在更新进程,无法启动怎么办?

    2021苹果全球开发者大会结束后,大批果粉迫不及待的尝试升级iOS 15测试版本,想第一时间体验新功能. 但是许多用户反馈升级一直卡死在"准备更新"."验证更新" ...

  5. iOS 应用数据存储方式(XML属性列表-plist)

    iOS 应用数据存储方式(XML属性列表-plist) 一.ios应用常用的数据存储方式 1.plist(XML属性列表归档) 2.偏好设置 3.NSKeydeArchiver归档(存储自定义对象) ...

  6. Android数据库表的创建和数据升级操作

    之前的文章有提到,可以在xml文件中配置数据库信息:http://www.cnblogs.com/wenjiang/p/4492303.html,现在就讲如何利用这些信息类构建数据库. xml文件大概 ...

  7. IOS - 本地数据持久化

    转:相对复杂的App仅靠内存的数据肯定无法满足,数据写磁盘作持久化存储是几乎每个客户端软件都需要做的.简单如“是否第一次打开”的BOOL值,大 到游戏的进度和状态等数据,都需要进行本地持久化存储.这些 ...

  8. iOS - JSON 数据解析

     iOS - JSON 数据解析 前言 NS_CLASS_AVAILABLE(10_7, 5_0) @interface NSJSONSerialization : NSObject @availab ...

  9. 改进iOS客户端的升级提醒功能

    改进iOS客户端的升级提醒功能 功能设计 先申明一下,我是码农,不是一个产品经理,但我觉得现有市面上的很多 App,设计的 "升级提示功能" 都不太友好.在此分享一下我的想法,欢迎 ...

随机推荐

  1. Git 分支管理和冲突解决

    Git 分支管理和冲突解决 创建分支 git branch 没有参数,显示本地版本库中所有的本地分支名称. 当前检出分支的前面会有星号. git branch newname 在当前检出分支上新建分支 ...

  2. java发送 email

    public class EmailUtils implements IAction { private static Logger logger = Logger.getLogger(EmailUt ...

  3. 3.0、Spring-注入

    一.Spring的基本介绍:Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson创建.简单来说,Spring是一个分层的JavaSE/ ...

  4. 补发:用Meal Prep+模块化饮食来减肥之实操

    自从上次读到仰望尾迹云 老师的模块化饮食的帖子,再了解了一些Meal Prep的内容,结合着做Meal Prep健康餐至今已经快一个半月了.整体感觉还可以,所以在这里讲一下自己的心得体会. 分为三个部 ...

  5. ACM之鸡血篇

    一匹黑马的诞生 故事还要从南京现场赛讲起,话说这次现场赛,各路ACM英雄豪杰齐聚南京,为争取亚洲总舵南京分舵舵主之职位,都使出了看 家本领,其中有最有实力的有京城两大帮清华帮,北大帮,南郡三大派上交派 ...

  6. Ruby安装Scss

    Ruby安装Scss 引言 已经许久不写HTML了,今天有点以前的东西要改.但是刚装的Windows10,已经没有以前的Web开发环境了.只好重新安装. 结果Webstorm装好后配置Scss出现错误 ...

  7. windows安装zookeeper-单机模式

    zookeeper下载地址:http://zookeeper.apache.org/releases.html#download   本次使用的是3.4.9版本 前提:请安装JDK 安装: 创建安装目 ...

  8. HBase 基本shell命令

  9. LaTeX简单使用方法

    Content LaTeX的用途 LaTeX文件布局 LaTeX的文档格式 公式环境 图的排版 表格的排版 有序列表和无序列表 引用 伪代码 参考文献 LaTeX的用途 LaTeX是一种基于TeX的排 ...

  10. C语言 活动安排问题

    有若干个活动,第i个开始时间和结束时间是[Si,fi),只有一个教室,活动之间不能交叠,求最多安排多少个活动? #include <stdio.h> #include <stdlib ...