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

            }

        }

    }];

}

相关文章
相关标签/搜索