有四个步骤 (有个问题 就是 假设老版本是 v1,
当前更新的版本是 v3,这个时候 还需要从 v1=》v2=》v3?
我觉得是不需要的,我觉的可以 直接 从 v1=》v3 这个版本,但是每个版本的字段我们是需要记录下来的 这样 就根据 不同的老版本 的数据 迁移到 最新版本中就可以了 ,下面写的例子 是参考的
)
- 把原来结构的T 改名 TempT
- 创建新版本数据结构的 表 T
- 将 TempT 中的 数据 =》T中
- 删除TempT 表
首先需要一个版本枚举
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];
}
网友评论