CoreData - 如何创建NSManagedObject的子类的子类(Generation Gap模式)

时间:2009-06-02 09:20:03

标签: cocoa cocoa-touch core-data

我确信这一定是一个愚蠢的问题,但我已经搜索了这些互联网并找不到答案。很多人谈论使用Generation Gap模式,其中你有一个从模型生成的NSManagedObject子类,然后将其子类化以添加瞬态属性和行为。这样做的好处是,如果您更改持久模型,则可以再次生成基本文件,而不会有覆盖自己代码的危险。

我有一个从NSManagedObject派生的基本CardMO对象。然后我将其子类化为自己的Card对象。

我的问题是,如何创建一个托管的Card对象?

我试过了:

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

但是这个对象实际上并不是一张卡片,当然我继续在这个对象上调用一个Card方法时会有例外。

我尝试使用alloc / init创建一个卡(其中init只调用[super init]),然后将其添加到managedObjectContext,如下所示:

[moc insertObject:(CardMO*)card];

这给了我一个神秘的错误“无法在NSManagedObject类'Card'上调用指定的初始值设定项”

我尝试通过调用[NSEntityDescription insertNewObjectForEntityForName:@“CardMO”inManagedObjectContext:[AIStoreManager sharedAIStoreManager] .managedObjectContext]而不是[super init]来修改它。在这种情况下,我回来的对象再次是CardMO,我无法在其上调用Card方法。

我该怎么办?

并且(对于奖励积分:-) - 在我通过这个障碍后,我需要从XML创建我的其他Card对象,然后将它们转换为NSManagedObjects。我正在使用基于Apple的XMLReaderSAX的代码 - 我把这个代码交给了一大块XML,它给了我许多Card对象的数组。我以后可以将这些对象添加到托管对象上下文中,还是必须进入XMLReaderSAX并更改它们创建这些对象的方式?

我正在写一个3.0的iPhone应用程序,但我认为这对于10.5的Core Data来说是相同的。

2 个答案:

答案 0 :(得分:8)

怀疑它!

在数据模型中,实体的类名必须是派生类最多的类 - 在我的情况下是卡。那么问题是你必须记住在生成任何新文件之前将名称更改为CardMO。

这必须是人们使用mogenerator的原因。

答案 1 :(得分:0)

为什么不使用NSCoding?然后,您可以支持XML或JSON或任何其他方法来描述应用程序之外的对象。