啟動遷移流程
本章介紹如何啟動遷移過程以及默認(rèn)的遷移過程的工作原理。它沒有描述自定義遷移過程。
當(dāng)你初始化一個持久性儲存協(xié)調(diào)器時,你可以為其分配托管對象模型;協(xié)調(diào)器使用該模型來打開持久儲存。使用addPersistentStoreWithType:configuration:URL:options:error:打開持久儲存。但是,如何使用此方法取決與應(yīng)用程序是使用模型版本控制器還是選擇支持的遷移方式,無論你選擇使用默認(rèn)遷移過程還是自定版本偏移檢測和遷移引導(dǎo)指令。以下列表描述了不同的場景以及應(yīng)該在每個場景中執(zhí)行的操作:
- 你的應(yīng)用程序不支持版本控制
你可以直接使用 addPersistentStoreWithType:configuration:URL:options:error:方法
如果由于某種原因,協(xié)調(diào)器的模型與儲存的模式不兼容(即,版本哈希當(dāng)前模型的實體不等于儲存的元數(shù)據(jù)中的實體),協(xié)調(diào)器檢測到此錯誤,并生成一個錯誤,并且 addPersistentStoreWithType:configuration:URL:options:error:返回NO。你必須正確處理此錯誤。 - 你的應(yīng)用程序支持版本控制,并且你選擇了輕量級或默認(rèn)遷移過程。
使用 addPersistentStoreWithType:configuration:URL:options:error 分別在輕量級遷移和默認(rèn)遷移過程中所述。
與非版本方法的根本區(qū)別在于,你指示協(xié)調(diào)器通過向密匙 為 NSMigratePersistentStroresAutomaticallyOption的選項字典添加條目,將儲存自動遷移到當(dāng)前模型版本,該值是表示“YES”的NSNumber對象。 - 你的應(yīng)用程序支持版本控制,并且你選擇使用自定義版本偏移檢測和遷移引導(dǎo)。
在打開儲存之前,使用 isConfiguration:CompatibleWithyStoreMetadata:檢測其架構(gòu)是否與協(xié)調(diào)器的型號兼容: - 如果是,則使用 addPersistentStoreWithType:configuration:URL:options:error:直接打開儲存。
- 如果不是,那么必須首先遷移儲存,然后打開它(再次使用addPersistentStoreWithType:configuration:URL:options:error:)。
你可以簡單的使用addPersistentStoreWithType:configuration:URL:options:error:檢查是否需要遷移,但這是一個重量級的操作,對于此目的來說效率不高。
重要的是要認(rèn)識到兩個正交概念:
- 你可以在遷移期間執(zhí)行自定義代碼。
- 你可以擁有版偏移檢測和遷移引導(dǎo)的自定義代碼。
遷移策略類允許你以多種方式自定義實體和屬性的遷移,這些通常是你需要的。但是,你可能會使用自定義偏移檢測和遷移引導(dǎo)(自舉),以便你可以控制遷移過程。例如,如果您有非常大的儲存,則可以使用兩個數(shù)據(jù)模型設(shè)置遷移管理器,然后使用一系列映射模型將數(shù)據(jù)遷移到目標(biāo)儲存中(如果對每個調(diào)用使用相同的目標(biāo)URL,Core Data將對新對象添加到現(xiàn)有儲存中)。這允許框架(和你)在轉(zhuǎn)換過程中限制內(nèi)存中的數(shù)據(jù)量。
默認(rèn)遷移流程
要打開儲存并執(zhí)行遷移(如果有必要):請使用addPersistentStoreWithType:configuration:URL:options:error:方法,并且將選項添加到密匙為NSMigratePersistentStoresAutomaticasllyOption的條目中,該值為表示“YES”的NSNumber對象。你的代碼與下示類似:
Listing 6-1 Opening a store using automatic migration
NSError *error;
NSPersistentStoreCoordinator *psc = <#The coordinator#>;
NSURL *storeURL = <#The URL of a persistent store#>;
NSDictionary *optionsDictionary =
[NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES]
forKey:NSMigratePersistentStoresAutomaticallyOption];
NSPersistentStore *store = [psc addPersistentStoreWithType:<#Store type#>
configuration:<#Configuration or nil#>
URL:storeURL
options:optionsDictionary
error:&error];
如果遷移成功,則在您的任何文件拓展名和已遷移的儲存保存到storeURL之前,storeURL上的現(xiàn)有儲存將已“~”后綴重新命名。
在執(zhí)行addPersistentStoreWithType:configuration:URL:options:error:時,Core Data執(zhí)行以下操作:
- 嘗試查找可用于打開儲存的托管對象模型
Core Data依次搜索應(yīng)用程序的資源模型以進(jìn)行測試。如果找不到合適的模型,Core Data將返回一個nil和一個合適的錯誤(error)。 - 嘗試找到從現(xiàn)有儲存的托管對象模型映射到永久儲存協(xié)調(diào)器正在使用的映射模型。
Core Data通過應(yīng)用程序的資源搜索可用的映射模型并一次進(jìn)行測試。如果找不到合適的映射,則Core Data將返回NO和一個合適的錯誤(error)。
請注意:必須創(chuàng)建一個合適的映射模型才能使此階段成功。 - 創(chuàng)建映射模型所需的遷移策略對象的實例。
注:即使你使用默認(rèn)遷移過程,也可以使用自定義遷移策略類自定遷移。