cocoa - CoreData - 如何创建 NSManagedObject 子类的子类(世代间隙模式)

标签 cocoa cocoa-touch core-data

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

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

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

我尝试过:

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

但是这个对象并不是真正的 Card,当然当我继续调用这个对象上的 Card 方法时会出现异常。

我尝试使用 alloc/init 创建一个 Card(其中 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 的代码 - 我将此代码交给了一 block XML,它返回了一个包含许多 Card 对象的数组。我可以稍后将这些对象添加到我的托管对象上下文中,还是必须进入 XMLReaderSAX 并更改它创建这些对象的方式?

我正在 3.0 上编写一个 iPhone 应用程序,但我认为这对于 10.5 版的 Core Data 来说也是一样的。

最佳答案

成功了!

在数据模型中,实体的类名必须是最派生类的类名 - 在我的例子中是 Card。那么麻烦的是,您必须记住在生成任何新文件之前将名称更改为 CardMO。

这一定是人们使用mogenerator的原因.

关于cocoa - CoreData - 如何创建 NSManagedObject 子类的子类(世代间隙模式),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/938617/

相关文章:

objective-c - 递归列出并存储目录内容

cocoa - 我将如何更改对象的 (x,y) 位置

objective-c - 无法在 UINavigationBar 中重命名或设置新的 backBarButtonItem

objective-c - 方法中间的可选 block : safe?

ios - 如何在 UITableView 部分之间添加分隔符?

iphone - NSRangeException 问题

ios - 如何使用 NSManagedObject 的子类?

objective-c - MacOS 应用程序窗口内的文件管理器

swift - Process with Launch Path/usr/bin/swift 是否需要在 Mac 上安装命令行工具?

ios - 用于登录用户数据的核心数据与 NSUserDefaults