在不获取现有对象的情况下创建核心数据关系

Posted

技术标签:

【中文标题】在不获取现有对象的情况下创建核心数据关系【英文标题】:Create Core Data Relationship Without Fetching the Existing Object 【发布时间】:2011-03-18 18:51:23 【问题描述】:

我们有一个流程需要更新现有的核心数据存储以添加子关系。我们已经有了一个名为人类的实体,但现在我们添加了将人类作为其他人类父母的能力。到目前为止,我们这样做的方式是首先获取将成为父对象的人类,然后获取将成为子对象的人类,然后将子对象添加到父对象上名为“children”的 NSSet* 属性。然而,这需要从核心数据中同时获取子节点和父节点,这很慢,尤其是考虑到我们可能拥有数以万计的对象。

父/子关系是一项新功能,我们从服务器的 xml 流中获取关系数据。它基本上包含我们每个人的整数 id 和他们孩子的那个人的整数列表。

有没有办法在不获取孩子的情况下创建这种关系?您可以仅使用 NSManagedObjectID 或其他标识符创建这样的关系吗?或者您是否必须从核心数据中获取整个对象?我们确定的一件事是,所有人类对象都保证在核心数据中,因此永远不需要创建新的人类对象,它们都已经在核心数据存储中。

【问题讨论】:

【参考方案1】:

如果您拥有对象的实际 managedObjectID,则可以使用 -[NSMangedObjectContext objectForID:] 从数据库中仅获取该特定对象。这比获取每个对象要快。

但是,如果没有两个对象,就无法设置关系。

【讨论】:

【参考方案2】:

“获取的属性”旨在帮助解决此类问题,它允许您访问相关对象,就好像它是直接关系一样,但在请求之前它不会进行获取。它们只是一种方式的关系。

见:Fetched Properties v Relationships (Core Data - iPhone)

【讨论】:

如果速度是他关心的问题,那么获取的属性将无济于事。在每个对象中获取关系比首先将它们设置为关系需要更长的时间。【参考方案3】:

没有办法在不导致错误的情况下设置一对多关系的值。调用对象级设置器(例如 addParent:(Human *)parent)或直接操作设置将触发故障。 CoreData 必须这样做以确保关系完整性。

[NSManagedObjectContext objectForID:] 将向您返回一个错误,然后您可以使用它作为对象传递给关系,但是一旦您设置关系的一侧,对象就会出现错误。

我不确定您正在处理多少数据,但如果您的实体足够轻,理论上您可以将它们全部提取到内存中并在那里进行排序/搜索(NSArray + NSPredicate)。

【讨论】:

以上是关于在不获取现有对象的情况下创建核心数据关系的主要内容,如果未能解决你的问题,请参考以下文章

一对多关系在不使用“distinct”的情况下获取重复的对象。为啥?

核心数据 - 如何在不触发错误的情况下检查对象关系是不是存在

如果不存在则创建新的核心数据对象,或者如果核心数据存在则获取现有对象[重复]

SignInAsAuthenticationType 是不是允许我在不覆盖现有声明的情况下获取 OAuth 令牌?

Scala:在不创建对象的情况下获取默认值

在不使用表视图的情况下更新核心数据属性