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"];

            

            //瀏覽記錄,卻掉之前的comicIdunique約束

            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];

            }

        }

    }];

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM