本人在这里重要强调一下!!!数据库
看这里,看这里,看这里,重要的事说三遍。app
本人在项目开发中,因为需求问题,不得不对已经创建好的数据库进行修改(添加字段),我就很随意的直接添加了对一个的字段,运行一下,数据库报错打印出来好多内容(具体打印的东西没记录,意思就是找不到我刚才添加的字段),无奈我删掉app从新运行,竟然好了,我刚才添加的字段也正常能够用了。因此我就没在乎不少,知道项目即将上线,问题来,老大告诉我这样是根本不行的,用户单纯的升级app仍是没法用到这个字段的,只能删除从新下载。。。。。。。。我凌乱了,原来已经创建好的数据库不能直接的添加字段,必须升级,升级,升级!!!spa
上面是我惨痛的教训。下面我就总结一下,数据升级的知识。debug
1.你必须用NSUserDefaults存一个当前数据库的版本号:开发
[[NSUserDefaults standardUserDefaults] registerDefaults:@{@"DBVersion":@0}];it
2.在每次建立数据库(若是所建立的数据存在,就不会从新建立,这就是为何必须数据升级)时,咱们要判断当前数据库版本号和最新的数据库版本号是都一致,io
NSInteger currVersion = [UserDefaults integerForKey:VersionKey];class
BOOL fileExist = [[NSFileManager defaultManager] fileExistsAtPath:DBPath];//数据是否存在date
if (currVersion < DBVersion && fileExist) {//DBVersion最新的版本号file
//须要升级
_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];
}
}
}];
}