2009-06-02 78 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或任何其他方式来描述应用程序之外的对象。