2014-02-07 56 views
5

我在iOS應用程序中使用CoreData。在創建NSManagedObject類時,我大部分時間都遇到了問題。CoreData - 更新模型類而不是創建新的

這是我做的:

  1. .xcdatamodeld文件創建一個實體。
  2. 創建屬性和關係。
  3. 選擇選項Editor->Create NSManagedObject Class創建.h.m類。
  4. .h.m類中,我創建了一些用於獲取/保存對象的自定義方法。

到目前爲止好。但是之後如果我必須改變一些屬性,我會重複第2步和第3步。但是這一次,我在第4步中編寫的所有自定義代碼都會自動刪除。

所以我的問題是如何更新現有的類?而不是使用選項Editor->Create NSManagedObject Class,它刪除我所有的自定義代碼。

任何幫助表示讚賞。

更新:

測試兩種方法(分類和Mogernator)和看起來好像沒什麼問題。但是我選擇了一個純粹的Xcode方法。我不想冒任何第三方因XCode更新而可能發生中斷或者可能導致數據遷移問題的風險。

感謝@湯姆哈靈頓,以及@Valentin Shamardin指導我:)

+0

您*無法*更新現有的類,Xcode將始終覆蓋文件。您可以使用類別(如下面的答案中所述)或使用「mogenerator」(請參閱​​http://stackoverflow.com/questions/18190845/mogenerator-and-xcode-4-advantages-disadvantages進行比較)。但是在這兩種情況下,每個實體都有兩個類。 –

回答

11

爲了讓你必須創建Categories您的核心數據模型類一些額外的方法或其他的東西。 Paul Hegarty在覈心數據方面使用了這種方法。

+0

在上述情況下,類別如何提供幫助? – GMJigar

+0

@GMJigar,重寫'NSManagedObject'子類不會重寫類的類。 –

+0

@Valentin,我已經嘗試創建匿名類別(我的.m類中的類別)。它仍然被覆蓋。你有這樣的示例代碼或鏈接? – Khawar

-1

每當你改變或更新你的核心數據對象模型時,它就變得不兼容,無法打開,導致崩潰。 爲此,您需要執行核心數據模型版本控制和數據遷移。 版本控制並不僅僅爲您提供應用程序要使用的模型版本。核心數據模型中的更改和更新,如修改實體的任何屬性或添加新實體。它與Core數據庫模型有關。考慮你的應用程序將使用1.0版本並使用1的數據庫模型。如果你的數據庫模型有一些變化,它的版本會增加,現在你的應用程序將使用下一版本,即核心數據庫模型的版本號爲

詳情參考這個Apple Doc for Core Data Versioning

這也會導致舊的數據丟失。爲此,您需要執行遷移過程。 遷移期間,Core Data創建兩個堆棧,一個用於源存儲,另一個用於目標存儲。核心數據然後從源堆棧中獲取對象並將適當的相應對象插入目標堆棧「。

請參閱遷移過程的細節上Migration on Raywenderlich

您需要使用NSMigrationManager class

+0

感謝您的回覆,但我對Core Data Versioning或Migration不感興趣。這與我的問題無關。 :) – Khawar

5

的最佳方式來處理,這是使用mogenerator來生成模型類而不是Xcode中的做到這​​一點。隨着mogenerator你兩個類爲每個實體:

  • 一中重新生成每次重建模型類
  • 一個是另一個的子類,它僅產生你建立在第一時間模型類和哪個mogenerator從未改變。

因此,您可以將所有自定義代碼放在子類中,無論您重新生成模型類多少次,代碼都不會被覆蓋。

+0

這就是我要寫的 - 「mogenerator」爲我節省了很多時間。 –

+0

謝謝@Tom,我會試試看。 – Khawar

+0

@湯姆哈靈頓,我嘗試過'mogenerator',感覺很好。只是想了解Modal文件放置的最佳做法。目前'mogenerator'只是將每個實體的所有4個文件放在我的'Modals'目錄/組中。我有近30個實體意味着120個文件。這會使搜索變得困難。所以我該怎麼做?我應該爲每個實體創建一個組還是創建2個組(首先是所有'_'文件,其次是所有定製文件)。 我想確認的另一個問題是,它不會爲未來的Modal遷移造成任何問題嗎? – Khawar

相關問題