標籤:
在iOS開發中,經常會遇到資料庫升級,修改刪除表的某些欄位,這就需要我們來進行處理了,下面分析兩種資料庫的升級處理問題!
1.比如:我們常使用fmdb或者其他方式建立sqlite資料庫,但是由於版本迭代問題,常常有需求要更新資料庫,比如加欄位、刪除、修改欄位等等,怎麼樣才能升級資料庫且保持原來存的資料有效呢,上代碼:
const static NSInteger FAMILY_LIST_DB_MANAGER_VER = 1;
@implementation KSFamilyListDBManager
{
DBManager *_dbMgr;
}
+ (instancetype)sharedManager
{
static KSFamilyListDBManager *s_instance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
s_instance = [[KSFamilyListDBManager alloc] init];
});
return s_instance;
}
- (id)init {
self = [super init];
if (self) {
_dbMgr = [DBManager defaultMgr];
[self createTables];
// 升級操作
NSInteger ver = [[ConfigDBManager sharedManager] familyListDBManagerVersion];
if (ver < 1) {
[[ConfigDBManager sharedManager] setFamilyListDBManagerVersion:FAMILY_LIST_DB_MANAGER_VER];
} else if (ver < FAMILY_LIST_DB_MANAGER_VER) {
[self upgrade];
}
}
return self;
}
- (void)upgrade {
//擷取儲存好的原版本號碼
NSInteger oldVersionNum = [[ConfigDBManager sharedManager] familyListDBManagerVersion];
if (FAMILY_LIST_DB_MANAGER_VER <= oldVersionNum || oldVersionNum == 0) {
return;
}
//升級
[self upgrade:oldVersionNum];
// 儲存新的版本號碼到庫中 -這裡大家可以使用NSUserDefault儲存
[[ConfigDBManager sharedManager] setFamilyListDBManagerVersion:FAMILY_LIST_DB_MANAGER_VER];
}
- (void)upgrade:(NSInteger)oldVersion {
if (oldVersion >= FAMILY_LIST_DB_MANAGER_VER) {
return;
}
switch (oldVersion) {
case 0:
break;
case 1:
[self upgradeFrom1To2];
break;
case 2:
break;
default:
break;
}
oldVersion ++;
// 遞迴判斷是否需要升級
[self upgrade:oldVersion];
}
- (void)upgradeFrom1To2 {
//這裡執行Sql語句 執行版本1到版本2的更新
}
2.如果在iOS中使用了CoreData,資料庫升級後版本迭代升級如下:
如果IOS App 使用到CoreData,並且在上一個版本上有資料庫更新(新增表、欄位等操作),那在覆蓋安裝程式時就要進行CoreData資料庫的遷移,具體操作如下:
1.選中你的mydata.xcdatamodeld檔案,選擇菜單editor->Add Model Version 比如取名:mydata2.xcdatamodel
2.設定目前的版本
選擇上級mydata.xcdatamodeld ,在inspector中的Versioned Core Data Model選擇Current模版為mydata2
3.修改新資料模型mydata2,在新的檔案上添加欄位及表
4.刪除原來的類檔案,重建下類。
在appdelegate中
NSDictionary *optionsDictionary = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES],NSMigratePersistentStoresAutomaticallyOption,[NSNumber numberWithBool:YES],NSInferMappingModelAutomaticallyOption,nil];
NSError *error;
if (![self.persistentStoreCoordinator
addPersistentStoreWithType:NSSQLiteStoreType
configuration:nil
URL:storeUrl
options:optionsDictionary
error:&error]) {
NSLog(@"failed to add persistent store with type to persistent store coordinator");
}
添加 *optionsDictionary,原來options:nil 改成options:optionsDictionary
5.重新編譯下程式。
iOS 資料庫升級 如何進行操作?