iOS---FMDB数据升级
本人在这里重要强调一下!!!
看这里,看这里,看这里,重要的事说三遍。
本人在项目开发中,由于需求问题,不得不对已经建立好的数据库进行修改(添加字段),我就很随意的直接添加了对一个的字段,运行一下,数据库报错打印出来好多内容(具体打印的东西没记录,意思就是找不到我刚才添加的字段),无奈我删掉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数据升级的更多相关文章
- iOS FMDB的使用(增,删,改,查,sqlite存取图片)
iOS FMDB的使用(增,删,改,查,sqlite存取图片) 在上一篇博客我对sqlite的基本使用进行了详细介绍... 但是在实际开发中原生使用的频率是很少的... 这篇博客我将会较全面的介绍FM ...
- IOS开发数据存储篇—IOS中的几种数据存储方式
IOS开发数据存储篇—IOS中的几种数据存储方式 发表于2016/4/5 21:02:09 421人阅读 分类: 数据存储 在项目开发当中,我们经常会对一些数据进行本地缓存处理.离线缓存的数据一般都 ...
- iOS开发 数据缓存-数据库
iOS中数据存储方式 Plist(NSArray\NSDictionary) Preference(偏好设置\NSUserDefaults) NSCoding (NSKeyedArchiver\NSk ...
- iOS 15 Beta升级卡死在更新进程,无法启动怎么办?
2021苹果全球开发者大会结束后,大批果粉迫不及待的尝试升级iOS 15测试版本,想第一时间体验新功能. 但是许多用户反馈升级一直卡死在"准备更新"."验证更新" ...
- iOS 应用数据存储方式(XML属性列表-plist)
iOS 应用数据存储方式(XML属性列表-plist) 一.ios应用常用的数据存储方式 1.plist(XML属性列表归档) 2.偏好设置 3.NSKeydeArchiver归档(存储自定义对象) ...
- Android数据库表的创建和数据升级操作
之前的文章有提到,可以在xml文件中配置数据库信息:http://www.cnblogs.com/wenjiang/p/4492303.html,现在就讲如何利用这些信息类构建数据库. xml文件大概 ...
- IOS - 本地数据持久化
转:相对复杂的App仅靠内存的数据肯定无法满足,数据写磁盘作持久化存储是几乎每个客户端软件都需要做的.简单如“是否第一次打开”的BOOL值,大 到游戏的进度和状态等数据,都需要进行本地持久化存储.这些 ...
- iOS - JSON 数据解析
iOS - JSON 数据解析 前言 NS_CLASS_AVAILABLE(10_7, 5_0) @interface NSJSONSerialization : NSObject @availab ...
- 改进iOS客户端的升级提醒功能
改进iOS客户端的升级提醒功能 功能设计 先申明一下,我是码农,不是一个产品经理,但我觉得现有市面上的很多 App,设计的 "升级提示功能" 都不太友好.在此分享一下我的想法,欢迎 ...
随机推荐
- 室内定位系列(一)——WiFi位置指纹(译)
原文:<Advanced Location-Based Technologies and Services>--chapter 2 WiFi Location Fingerprint 作者 ...
- spring MVC 尝试传参json(应用部分)
spring 3.1后增加新的注解:@Requestbody,@Responsebody, 暂不论Requestdody, 若想让后端代码直接返回json字符串,可使用@Responsebody, 用 ...
- 日期格式转换 java 2016-09-03T00:00:00.000+08:00
/** * 日期格式转换yyyy-MM-dd'T'HH:mm:ss.SSSXXX (yyyy-MM-dd'T'HH:mm:ss.SSSZ) TO yyyy-MM-dd HH:mm:ss * @ ...
- 【UWP】通过特定URI打开Win10指定设置页面[转]
系统设置其实也是一个Modern应用,它与ms-settings:协议进行了关联. 在设置应用中的每一个具体的设置页面都有一个URI(统一资源标识符)与之对应,通过这些URI就可以直达某个具体的设置页 ...
- R语言画云字图
install.packages('wordcloud') library(wordcloud) colors=c('red','blue','green','yellow','purple') da ...
- Azure底层架构的初步分析
之所以要写这样的一篇博文的目的是对于大多数搞IT的人来说,一般都会对这个topic很感兴趣,因为底层架构直接关乎到一个公有云平台的performance,其实最主要的原因是我们的客户对此也非常感兴趣, ...
- 第3月第21天 nsclassfromstring返回null SVN报错:clean the working copy and then retry the operation
1. xcodeproj工程损坏时,.m文件没有加入编译. 2. SVN报错:clean the working copy and then retry the operation http://bl ...
- new Array(n) 的坑 密集数组和稀疏数组
今天写Vue时遇到一个奇怪问题,需要监控网页上的input 是否都有值 // var blanks = new Array(number); // blanks的监控属性 var emptyNumbe ...
- Spring Boot 乐观锁加锁失败 - 使用AOP恢复错误
之前写了一些辅助工作相关的Spring Boot怎么使用AOP.这里继续正题,怎么减少Spring Boot 乐观锁加锁报错的情况(基本可以解决). 1. 包依赖 spring-boot-starte ...
- java开发人员,最应该学习和熟练使用的工具类。google guava.(谷歌 瓜娃)
学习参考文章: http://blog.csdn.net/wisgood/article/details/13297535 http://ifeve.com/google-guava/ http:// ...