数据库的版本升级

2017-03-17  本文已影响23人  LeeDev

原文链接

有四个步骤 (有个问题 就是 假设老版本是 v1,当前更新的版本是 v3,这个时候 还需要从 v1=》v2=》v3? 我觉得是不需要的,我觉的可以 直接 从 v1=》v3 这个版本,但是每个版本的字段我们是需要记录下来的 这样 就根据 不同的老版本 的数据 迁移到 最新版本中就可以了 ,下面写的例子 是参考的

首先需要一个版本枚举

typedef NS_ENUM(NSInteger, DBVersion) {
    DBVersionV1,
    DBVersionV2,    //历史版本
    DBVersionV3,    //当前版本
};

static NSString *const DBVersionNum  = @"DBVersionNum";
static NSString *const dbPath = @"\tmp\tmp.db";     //数据库地址

static NSString *const createTable = @"create table if not exists  t1("
"id  integer PRIMARY KEY AUTOINCREMENT NOT NULL,"
"name char(50),"
"sex char(4),"
"recordDate  TIMESTAMP default (datetime('now', 'localtime')))";

- (instancetype)init{
    if (self = [super init]) {
        _queue = [FMDatabaseQueue databaseQueueWithPath:dbPath];
    }
    return self;
}
采用FMDatabaseQueue 进行数据库操作的管理。

/*
 *  需要初始化表结构时,调用此方法
 */
- (void)newDBVersionInit{
    if (![[NSUserDefaults standardUserDefaults] objectForKey:DBVersionNum]) {
        //系统之前没有数据库 新建立表。
        [self createTables];
    }else{
        DBVersion ver = [[[NSUserDefaults standardUserDefaults] objectForKey:DBVersionNum] integerValue];
        switch (ver) {
            case DBVersionV1:{
                [self v1ToV2];
            }
            case DBVersionV2:{
                [self v2Tov3];
            }
            case DBVersionV3:{

            }
                break;
            default:
                break;
        }
    }
}
/*
 *  创建新表
 */
- (void)createTables{
    [_queue inTransaction:^(FMDatabase *db, BOOL *rollback) {
        @try {
            [db executeUpdate:createTable];
        }
        @catch (NSException *exception) {
            *rollback = YES;
        }
    }];
    [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithInteger:DBVersionV3] forKey:DBVersionNum];
}
把 DBVersionNum的值写为V3版本 方便下次对比。

/*
 *  版本1 向 版本2 数据迁移
 */
- (void)v1ToV2{

    [_queue inTransaction:^(FMDatabase *db, BOOL *rollback) {
        @try {

            //将原始表名T1 修改为 tempT1
            NSString *renameString = @"alter table t1 rename to tempT1";
            [db executeUpdate:renameString];

            //创建新表T1(V2版本的新表创建)
            [db executeUpdate:createTable];

            //迁移数据
            NSString *toString = @"insert into t1(name,sex)  select name,sex from tempT1";
            [db executeUpdate:toString];

            //删除tempT1临时表
            NSString *dropTableStr1 = @"drop table tempT1";
            [db executeUpdate:dropTableStr1];
        }
        @catch (NSException *exception) {
            *rollback = YES;
        }
    }] ;


    [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithInteger:DBVersionV2] forKey:DBVersionNum];
}
上一篇下一篇

猜你喜欢

热点阅读