如何从 Core Data 中的关系相关实体获取属性?
Posted
技术标签:
【中文标题】如何从 Core Data 中的关系相关实体获取属性?【英文标题】:How do I get attributes from relationship-related entity in Core Data? 【发布时间】:2011-05-02 20:32:46 【问题描述】:我对 ObjC 有经验,但对 Core Data 比较陌生。到目前为止,这一直很简单,但我有点受不了人际关系,所以我希望有人能指出我正确的方向。
我有两个实体:一个是人员列表,另一个是事件列表。
我在两个实体之间的数据模型中设置了反向关系(称为“人员”),人员方面设置为“多对多”。换句话说,我可以有 5 个人,但有数千个事件;每个事件都与一个人相关联,但一个人可以负责任意数量的事件。
我使用 [NSEntityDescription insertNewObjectForEntityForName...] 添加事件,然后使用 NSFetchedResultsController 检索它们。
问题是在获取特定事件对象时,我还没有成功地检索到有关人员的数据。示例:
Log *logEntry = [_fetchedResultsController objectAtIndexPath:indexPath];
// this works:
NSLog(@"description: %@", logEntry.description);
NSLog(@"happened %i minutes ago", -[logEntry.date timeIntervalSinceNow] / 60);
// this does not (just spits out NULL):
NSLog(@"person responsible: %@", logEntry.people.name);
我错过了什么?我如何获取关系中的人的数据?我有一种感觉,我在首先添加日志条目时遗漏了一个重要链接,或者在检索日志条目时可能是一个必要的谓词。在关系和具体示例方面,Apple 的文档有点少。我可能仍然对老式 SQL 感到困惑,所以我真的可以使用一些帮助。谢谢!
【问题讨论】:
【参考方案1】:如果 people 是多个人,那么它会作为一个集合返回 - 所以 logEntry.people 返回一个 NSSet 的人,你必须循环它才能取出 People,从而能够询问人的姓名.
与多个对象的任何关系都被建模为一组(目前在 ios 中)。
【讨论】:
感谢您的回复。如上所述,一个事件应该与一个人相关联。如果只有一条记录,logEntry.people 是否会作为 NSSet 返回?顺便说一句,我已经尝试过了,但是当我将它转换为 NSSet 时,该集合是空的。我怀疑要么缺少谓词,要么我错误地插入了记录。还有什么想法吗? 如果你有反向关系设置一个人的事件,也应该设置一个人的事件。你声称只有一个人是可能的,但如果是这样,为什么这种关系被命名为“人”——对我来说,这表明这种关系是对多的。 它被称为“人”是为了与应用程序的其余部分保持一致,并将其与“人”区分开来,我用它来识别“人”实体中的单个记录。由于我得到的数据是空的,我认为要么是获取请求是错误的,要么是数据不完整。如果 fetch 请求仅包含我已经包含的内容,那么数据一定是错误的。我不明白的是,我应该如何将单个事件与人员实体中的单个人关联起来。 在旁注中,该术语确实令人困惑,以至于我不确定我是否已经了解该模型了。你能隔离模型的那一部分并生成屏幕截图吗?将单个事件与人关联的方式的简单答案是只说 even.person = person,您将从人员中提取特定的人(除非人是人,这再次让我感到困惑)。 很抱歉混淆了命名法 - 我会重新考虑。无论如何,我已经找到了问题所在。事实证明,当新事件添加到数据库时,我没有为 event.person 分配有效对象。这根本不是获取问题。对于那些遵循这一点的人,您只需要从相关实体中检索一个有效对象,在使用 insertNewObjectForEntityForName 时将其保留足够长的时间(以数组或其他方式)以引用它。感谢您的帮助,肯德尔!以上是关于如何从 Core Data 中的关系相关实体获取属性?的主要内容,如果未能解决你的问题,请参考以下文章