前言:最近ChinaDaily項目需要迭代一個新版本,在這個版本中CoreData數(shù)據(jù)庫模型上有新增表迂求、實體字段的增加,那么在用戶覆蓋安裝程序時就必須要進行CoreData數(shù)據(jù)庫的版本升級和舊數(shù)據(jù)遷移晃跺,如果僅僅是在舊版本的數(shù)據(jù)模型上進行上述操作,就會造成所有舊用戶更新完成后的第一次啟動崩潰毫玖。
示例Demo:CoreDataLearn
- 數(shù)據(jù)遷移的方式有好幾種掀虎,這里就先介紹我用的輕量級的數(shù)據(jù)遷移方式:Core Data輕量級遷移是適用于添加新表,添加新的實體付枫,添加新的實體屬性烹玉,等簡單的,系統(tǒng)能自己推斷出來的遷移方式阐滩。
接下來在我之前寫的 iOS CoreData (一) 增刪改查 示例基礎上進行演示:
1二打、新建一個版本的數(shù)據(jù)庫模型Model2:
-
選中Model.xcdatamodeld文件,選擇菜單editor->Add Model Version 取名為:Model2.xcdatamodel掂榔,然后就可以發(fā)現(xiàn)Model.xcdatamodeld目錄下有兩個版本的數(shù)據(jù)庫模型
2继效、設置當前coreData的數(shù)據(jù)模型為Model2:
-
選中Model.xcdatamodel或Model2.xcdatamodel,在左側(cè)的Model Version 中選擇Current模版為Model2
3装获、修改新數(shù)據(jù)模型Model2瑞信,在Model2上添加字段及表:
-
從第2步 演示圖中可以看到舊Model中的表和實體屬性都自動遷移到了Model2中,新的表和實體屬性我們可以直接在Model2上操作創(chuàng)建穴豫,但是別忘了刪除原來的類文件凡简,重新生成下新的實體類:
4、設置數(shù)據(jù)庫參數(shù)options精肃,打開數(shù)據(jù)庫升級遷移的開關秤涩。
- 把方法- (nullable __kindof NSPersistentStore *)addPersistentStoreWithType:(NSString *)storeType configuration:(nullable NSString *)configuration URL:(nullable NSURL *)storeURL options:(nullable NSDictionary *)options error:(NSError **)error中的options參數(shù)置為如下的options字典
//創(chuàng)建持久化存儲助理:數(shù)據(jù)庫
NSPersistentStoreCoordinator * store = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];
//請求自動輕量級遷移
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
[NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption,
nil];
NSError *error = nil;
//設置數(shù)據(jù)庫相關信息 添加一個持久化存儲庫并設置存儲類型和路徑,NSSQLiteStoreType:SQLite作為存儲庫
[store addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:sqlUrl options:options error:&error];
這里說一下新增加的2個參數(shù)的意義:
NSMigratePersistentStoresAutomaticallyOption = YES司抱,那么Core Data會試著把之前低版本的出現(xiàn)不兼容的持久化存儲區(qū)遷移到新的模型中筐眷,這里的例子里,Core Data就能識別出是新表状植,就會新建出新表的存儲區(qū)來浊竟。
NSInferMappingModelAutomaticallyOption = YES,這個參數(shù)的意義是Core Data會根據(jù)自己認為最合理的方式去嘗試MappingModel,從源模型實體的某個屬性津畸,映射到目標模型實體的某個屬性振定。
5、編譯結(jié)束肉拓,CoreData調(diào)試:
打開Product后频,選擇Edit Scheme.
選擇Arguments,在下面的ArgumentsPassed On Launch中添加下面兩個選項,如圖:
(1)-com.apple.CoreData.SQLDebug
(2)1
之前相關文章:iOS CoreData (一) 增刪改查