本人在這裏重要強調一下!!!數據庫
看這裏,看這裏,看這裏,重要的事說三遍。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];
}
}
}];
}