Core Data (Initiating the Migration process)

啟動遷移流程

本章介紹如何啟動遷移過程以及默認(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)識到兩個正交概念:

  1. 你可以在遷移期間執(zhí)行自定義代碼。
  2. 你可以擁有版偏移檢測和遷移引導(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í)行以下操作:

  1. 嘗試查找可用于打開儲存的托管對象模型
    Core Data依次搜索應(yīng)用程序的資源模型以進(jìn)行測試。如果找不到合適的模型,Core Data將返回一個nil和一個合適的錯誤(error)。
  2. 嘗試找到從現(xiàn)有儲存的托管對象模型映射到永久儲存協(xié)調(diào)器正在使用的映射模型。
    Core Data通過應(yīng)用程序的資源搜索可用的映射模型并一次進(jìn)行測試。如果找不到合適的映射,則Core Data將返回NO和一個合適的錯誤(error)。
    請注意:必須創(chuàng)建一個合適的映射模型才能使此階段成功。
  3. 創(chuàng)建映射模型所需的遷移策略對象的實例。

注:即使你使用默認(rèn)遷移過程,也可以使用自定義遷移策略類自定遷移。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,578評論 6 544
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,701評論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,691評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,974評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 72,694評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 56,026評論 1 329
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,015評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,193評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,719評論 1 336
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,442評論 3 360
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,668評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,151評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,846評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,255評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,592評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,394評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 48,635評論 2 380

推薦閱讀更多精彩內(nèi)容