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

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

本人在项目开发中,由于需求问题,不得不对已经建立好的数据库进行修改(添加字段),我就很随意的直接添加了对一个的字段,运行一下,数据库报错打印出来好多内容(具体打印的东西没记录,意思就是找不到我刚才添加的字段),无奈我删掉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. 在 .NET 中开发基于 Chrome 内核的浏览器-创建一个简单浏览器

    首先在 http://www.cftea.com/tools/downloads/Cef.zip 下载文件包. 一.将文件解压拖入到 Visual Studio 对应的 WinForm 项目中. 二. ...

  2. 浅谈ScrollView嵌套ListView及ListView嵌套的高度计算

    引言 在Android开发中,我们有时会需要使用ScrollView中嵌套ListView的需求.例如:在展示信息的ListView上还有一部分信息展示区域,并且要求这部分信息展示区域在ListVie ...

  3. mac显示隐藏文件

    苹果Mac OS X操作系统下,隐藏文件是否显示有很多种设置方法,最简单的要算在Mac终端输入命令. 显示/隐藏Mac隐藏文件命令如下(注意其中的空格并且区分大小写): 第一种 显示Mac隐藏文件的命 ...

  4. juery学习总结(二)——juery操作页面元素

    所有的操作都可以分为增.删.改.查四种,juery选择器代表查看的功能,那么剩下的操作就是对页面元素增.删.改.页面元素有3部分构成:标签,属性和内容,juery对元素的操作可以从这3方面入手. 一. ...

  5. tomcat启动的了,但是加载项目失败

    解决方法: 1.tomcat启动是好的,也有可能找不到tomcat的dll,所以,检查一下myeclipse所使用的tomcat的解压目录是不是有空格,有空格的话,重新解压到一个新目录,千万不要有空格 ...

  6. 又一枚精彩的弹幕效果jQuery实现

    精彩的弹幕效果分享给大家,具有一定的参考价值,感兴趣的朋友可以尝试制作弹幕,具体内容如下   简易弹幕效果:将发布的内容随机显示在弹幕右侧,逐渐左移最后消失.   涉及知识点:val().random ...

  7. [Machine Learning & Algorithm] 神经网络基础

    目前,深度学习(Deep Learning,简称DL)在算法领域可谓是大红大紫,现在不只是互联网.人工智能,生活中的各大领域都能反映出深度学习引领的巨大变革.要学习深度学习,那么首先要熟悉神经网络(N ...

  8. python dict clear只能删除一层,不能够递归删除。

    void PyDict_Clear(PyObject *op) { dictobject *mp; dictentry *ep, *table; int table_is_malloced; Py_s ...

  9. 【Winform】使用BackgroundWorker控制进度条显示进度

    许多开发者看见一些软件有进度条显示进度,自己想弄,项目建好后发现并没有自己想象中的那么简单...看了网上很多教程后,写了一个小Demo供网友们参考~~,Demo的网址:http://pan.baidu ...

  10. VMWARE修改CPUID

    在cmd shell下执行wmic cpu get ProcessorId命令,可是查看机器的cpuID,但这个命令显示的只是2组ID,实际CPUID,有4组 通过更改虚拟机配置文件.vmx可是实现任 ...