有四個步驟 (有個問題 就是 假設(shè)老版本是 v1,
當前更新的版本是 v3攒磨,這個時候 還需要從 v1=》v2=》v3缺亮?
我覺得是不需要的澈侠,我覺的可以 直接 從 v1=》v3 這個版本形庭,但是每個版本的字段我們是需要記錄下來的 這樣 就根據(jù) 不同的老版本 的數(shù)據(jù) 遷移到 最新版本中就可以了 杰妓,下面寫的例子 是參考的
)
- 把原來結(jié)構(gòu)的T 改名 TempT
- 創(chuàng)建新版本數(shù)據(jù)結(jié)構(gòu)的 表 T
- 將 TempT 中的 數(shù)據(jù) =》T中
- 刪除TempT 表
首先需要一個版本枚舉
typedef NS_ENUM(NSInteger, DBVersion) {
DBVersionV1,
DBVersionV2, //歷史版本
DBVersionV3, //當前版本
};
static NSString *const DBVersionNum = @"DBVersionNum";
static NSString *const dbPath = @"\tmp\tmp.db"; //數(shù)據(jù)庫地址
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 進行數(shù)據(jù)庫操作的管理。
/*
* 需要初始化表結(jié)構(gòu)時碘勉,調(diào)用此方法
*/
- (void)newDBVersionInit{
if (![[NSUserDefaults standardUserDefaults] objectForKey:DBVersionNum]) {
//系統(tǒng)之前沒有數(shù)據(jù)庫 新建立表。
[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;
}
}
}
/*
* 創(chuàng)建新表
*/
- (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 數(shù)據(jù)遷移
*/
- (void)v1ToV2{
[_queue inTransaction:^(FMDatabase *db, BOOL *rollback) {
@try {
//將原始表名T1 修改為 tempT1
NSString *renameString = @"alter table t1 rename to tempT1";
[db executeUpdate:renameString];
//創(chuàng)建新表T1(V2版本的新表創(chuàng)建)
[db executeUpdate:createTable];
//遷移數(shù)據(jù)
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];
}