天天看點

《Core Data應用開發實踐指南》一3.3 輕量級的遷移方式

本節書摘來自華章出版社《core data應用開發實踐指南》一書中的第3章,第3.3節,作者 (美)tim roadley,更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視

把新模型設為目前版本之後,必須遷移現有的持久化存儲區,隻有這樣,才能正常使用新模型。這是因為,持久化存儲區協調器會試着用新版的模型來打開原有的存儲區,但由于原有的存儲區是用舊版模型建立的,是以該操作會失敗。在向nspersis-tentstorecoordinator添加存儲區的時候,隻需将下列選項放在nsdictionary裡傳過去,即可自動完成存儲區的遷移工作:

如果傳給nspersistentstorecoordinator的nsmigratepersistentstores-automaticallyoption是yes,那麼core data就會試着把低版本的(也就是與目前模型不相容的)持久化存儲區遷移到最新版本的模型。

如果傳給nspersistentstorecoordinator的nsinfermappingmodelaut-omaticallyoption是yes,那麼core data就會試着以最為合理的方式自動推斷出源模型實體(source model entity)中的某個屬性到底對應于“目标模型實體”(destination model entity)中的哪一個屬性。

把上述兩個選項都打開并傳給nspersistentstorecoordinator,這種遷移方式就叫做輕量級遷移(lightweight migration),程式清單3-1中的粗體代碼示範了該方式。我們修改了coredatahelper.m檔案中的loadstore方法,在裡面設定了這兩個選項。請注意,假如在開發core data程式時還使用了icloud,那麼隻能采用這種遷移方式。

《Core Data應用開發實踐指南》一3.3 輕量級的遷移方式

請按下列步驟修改grocery dude,以啟用輕量級遷移:

修改coredatahelper.m檔案中的loadstore方法,用程式清單3-1裡的代碼把原有代碼替換掉。筆者用粗體标出了改動的部分,以示強調。

重新運作應用程式,這次應該就不會崩潰了。

從現在開始,隻需把新模型設為目前版本并啟用輕量級遷移,core data就會無縫地完成遷移過程。

在示範其他遷移方式之前,我們需要生成一些測試用的資料。程式清單3-2裡的代碼可以根據measurement實體來生成托管對象。

《Core Data應用開發實踐指南》一3.3 輕量級的遷移方式

請按下列步驟修改grocery dude,以便生成測試用的資料:

根據measurement實體建立nsmanagedobject子類。建立步驟在第2章中講過:首先選中實體,然後點選editor>create nsmanagedobject subclass...菜單項,并按提示操作。在儲存類檔案這個步驟中,别忘了勾選targets裡的“grocery dude”。

把#import"measurement.h"添加到appdelegate.m頂部。

修改appdelegate.m檔案的demo方法,用程式清單3-2中的代碼替換掉原有代碼。

運作一遍應用程式。這次它會向持久化存儲區裡插入大量測試資料,你可以從控制台的日志中觀察到這一操作。根據電腦執行程式的快慢,該操作可能要花些時間。請耐心等待這些資料插入完畢。為了于稍後示範遷移的速度,我們現在必須在持久化存儲區中放入大量資料。

隻要運作一遍應用程式,持久化存儲區裡就會有測試資料了,是以現在無需再次啟動應用程式,以免它又向存儲區中重複添加資料。請注意,items這個表格視圖裡面還沒有内容,因為我們還沒有把它要顯示的内容配置好。

下一步是重新配置demo方法,令其顯示出持久化存儲區裡的一部分内容。程式清單3-3中的代碼可以擷取少量measurement樣例資料。注意,我們通過新的選項把擷取到的結果數量限制為50。從大的資料集中擷取資料時,這個限制選項很有用處,如果能和排序操作結合起來就更好了,比方說,可以按某項标準列出排名前50的資料。

《Core Data應用開發實踐指南》一3.3 輕量級的遷移方式

請按下列步驟修改grocery dude,以防應用程式再次插入測試資料:

修改appdelegate.m檔案中的demo方法,用程式清單3-3替換掉方法裡原有的代碼。

運作應用程式。

用sqlite database browser工具檢視grocery-dude.sqlite檔案的内容,第2章曾講過該工具的用法。圖3-4示範了正常的操作結果。

《Core Data應用開發實踐指南》一3.3 輕量級的遷移方式

在學習下一節之前,一定要先關掉sqlite database browser。