前言:最近ChinaDaily專案需要迭代一個新版本,在這個版本中CoreData資料庫模型上有新增表、實體欄位的增加,那麼在使用者覆蓋安裝程式時就必須要進行CoreData資料庫的版本升級和舊資料遷移,如果僅僅是在舊版本的資料模型上進行上述操作,就會造成所有舊使用者更新完成後的第一次啟動崩潰。 示例Demo:CoreDataLearn
- 資料遷移的方式有好幾種,這裡就先介紹我用的輕量級的資料遷移方式:Core Data輕量級遷移是適用於新增新表,新增新的實體,新增新的實體屬性,等簡單的,系統能自己推斷出來的遷移方式。 接下來在我之前寫的 iOS CoreData (一) 增刪改查 示例基礎上進行演示:
1、新建一個版本的資料庫模型Model2:
- 選中Model.xcdatamodeld檔案,選擇選單editor->Add Model Version 取名為:Model2.xcdatamodel,然後就可以發現Model.xcdatamodeld目錄下有兩個版本的資料庫模型
2、設定當前coreData的資料模型為Model2:
- 選中Model.xcdatamodel或Model2.xcdatamodel,在左側的Model Version 中選擇Current模版為Model2
3、修改新資料模型Model2,在Model2上新增欄位及表:
- 從第2步 演示圖中可以看到舊Model中的表和實體屬性都自動遷移到了Model2中,新的表和實體屬性我們可以直接在Model2上操作建立,但是別忘了刪除原來的類檔案,重新生成下新的實體類:
4、設定資料庫引數options,開啟資料庫升級遷移的開關。
- 把方法- (nullable __kindof NSPersistentStore *)addPersistentStoreWithType:(NSString *)storeType configuration:(nullable NSString *)configuration URL:(nullable NSURL *)storeURL options:(nullable NSDictionary *)options error:(NSError **)error中的options引數置為如下的options字典
//建立持久化儲存助理:資料庫
NSPersistentStoreCoordinator * store = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];
//請求自動輕量級遷移
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
[NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption,
nil];
NSError *error = nil;
//設定資料庫相關資訊 新增一個持久化儲存庫並設定儲存型別和路徑,NSSQLiteStoreType:SQLite作為儲存庫
[store addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:sqlUrl options:options error:&error];
複製程式碼
這裡說一下新增加的2個引數的意義: NSMigratePersistentStoresAutomaticallyOption = YES,那麼Core Data會試著把之前低版本的出現不相容的持久化儲存區遷移到新的模型中,這裡的例子裡,Core Data就能識別出是新表,就會新建出新表的儲存區來。 NSInferMappingModelAutomaticallyOption = YES,這個引數的意義是Core Data會根據自己認為最合理的方式去嘗試MappingModel,從源模型實體的某個屬性,對映到目標模型實體的某個屬性。
5、編譯結束,CoreData除錯:
開啟Product,選擇Edit Scheme. 選擇Arguments,在下面的ArgumentsPassed On Launch中新增下面兩個選項,如圖: (1)-com.apple.CoreData.SQLDebug (2)1
之前相關文章:iOS CoreData (一) 增刪改查