NSManagedObject CoreData 中的父子层次结构

Posted

技术标签:

【中文标题】NSManagedObject CoreData 中的父子层次结构【英文标题】:Parent-Child Hierarchy in NSManagedObject CoreData 【发布时间】:2014-11-06 05:06:56 【问题描述】:

在 xcdatamodeld 文件中,我创建了一个带有 firstNamelastNameemail 字段的 Person 实体。然后我创建了一个 User 实体,其中包含一个额外的字段。我将Person 设置为User 的父实体。

然后我使用“编辑器”菜单中的“创建 NSManagedObject 子类...”选项并为这些实体生成类。

现在,当我执行User* user = [[User alloc] init] 时,由于某种原因,我无法访问user.firstName 或超类Person 的其他属性。它说,“在 User* 类型的对象上找不到属性 firstName”

当我检查时,生成的User 类是NSManagedObject 的子类,而不是Person。我认为这是一个问题,并将User 更改为Person 的子类。代码编译正常,但在运行时崩溃并出现此错误 --

2014-11-05 20:24:14.142 MyApp[15131:3332646] CoreData: error: Failed to call designated initializer on NSManagedObject class 'User' 
2014-11-05 20:24:14.142 MyApp[15131:3332646] -[User setFirstName:]: unrecognized selector sent to instance 0x7fee5a436b90

我真的不知道我在这里做错了什么。我认为 Xcode 应该能够正确生成类,并且我应该能够开箱即用地使用它们。

【问题讨论】:

我,and others 发现在 XCode GUI 中不显示父实体很容易。只需将父实体设置为 Person 就足以访问 user.firstName。您还可以查询 user.entity.superEntity.name 或其他类似路径来检查继承。 【参考方案1】:

我怀疑初始化失败(列表中的第一个错误)是第二个错误(无法识别的选择器)的原因。

您需要使用initWithEntity:insertIntoManagedObjectContext: 而不仅仅是init。或者使用NSEntityDescription's insertNewObjectForEntityForName:inManagedObjectContext: 类方法。

【讨论】:

是的。几个小时后,我意识到了这一点。这就是问题所在。

以上是关于NSManagedObject CoreData 中的父子层次结构的主要内容,如果未能解决你的问题,请参考以下文章

CoreData:将字符串转换为 NSManagedObject 实例

SWIFT CoreData NSManagedObject

保持 CoreData NSManagedObject 新鲜

如何在 CoreData 的代码中设置 NSManagedObject 与另一个 NSManagedObject 或它们的堆栈的关系?

调用 NSManagedObject 类上的指定初始化程序失败 - CoreData

CoreData:NSManagedObject 不响应用户定义的消息