2009-06-02 79 views
7

我相信這肯定是一個愚蠢的問題,但我已經搜索到了網絡間並找不到答案。很多人都在談論如何使用Generation Gap模式,其中有一個從您的模型生成的NSManagedObject子類,然後將其添加到子類中以添加瞬態屬性和行爲。這樣做的好處是,如果更改持久化模型,則可以再次生成基礎文件,而不會覆蓋自己的代碼。CoreData - 如何創建NSManagedObject的子類的子類(Generation Gap pattern)

我有一個從NSManagedObject派生的基礎CardMO對象。然後我將這個子類化成我自己的Card對象。

我的問題是,如何創建一個管理的卡對象?

我想:

Card* card = [NSEntityDescription insertNewObjectForEntityForName:@"CardMO" inManagedObjectContext:moc]; 

但這對象是不是一個真正的卡,當我去到調用這個對象上的卡方法當然有一個例外。

我試圖創造與分配/ init中的卡(其中INIT只是調用[超級的init]),然後將它添加到managedObjectContext這樣的:

[moc insertObject:(CardMO*)card]; 

這給了我神祕的錯誤「未能呼籲NSManagedObject類 '卡' 的指定初始化」通過調用

我試着修改此[NSEntityDescription insertNewObjectForEntityForName:@ 「CardMO」 inManagedObjectContext:AIStoreManager sharedAIStoreManager] .managedObjectContext]而不是[超級初始化。在這種情況下,我返回的對象又是一個CardMO,我不能在其上調用Card方法。

我該怎麼做?

(對於獎勵積分:-) - 在我通過這個障礙之後,我需要從XML創建其他Card對象,然後將它們轉換爲NSManagedObjects。我使用的是基於Apple的XMLReaderSAX的代碼 - 我將這段代碼交給了一個XML塊,它給了我很多Card對象的數組。以後可以將這些對象添加到我的託管對象上下文中,還是必須進入XMLReaderSAX並更改它如何創建這些對象?

我正在寫一個3.0的iPhone應用程序,但我認爲這與10.5的核心數據是一樣的。

回答

8

Sus它!

在數據模型中,實體的類名必須是派生類最多的類 - 我的例子中的卡。麻煩的是你必須記住在生成任何新文件之前將名稱更改爲CardMO。

這一定是爲什麼人們使用mogenerator

+0

要從解析器中創建託管對象,我必須獲取Apple派生的代碼,並將對象創建代碼更改爲如上所示。它運行良好。 – 2009-06-03 07:40:36

0

爲什麼不使用NSCoding?然後,您可以支持XML或JSON或任何其他方式來描述應用程序之外的對象。