NSManagedObject CoreData 中的父子层次结构
Posted
技术标签:
【中文标题】NSManagedObject CoreData 中的父子层次结构【英文标题】:Parent-Child Hierarchy in NSManagedObject CoreData 【发布时间】:2014-11-06 05:06:56 【问题描述】:在 xcdatamodeld 文件中,我创建了一个带有 firstName
、lastName
和 email
字段的 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 或它们的堆栈的关系?