iOS---FMDB數據升級

本人在這裏重要強調一下!!!數據庫

看這裏,看這裏,看這裏,重要的事說三遍。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"];

            

            //瀏覽記錄,卻掉以前的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];

            }

        }

    }];

}

相關文章
相關標籤/搜索