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

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

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

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

【问题讨论】:

    标签: ios core-data


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-12
        • 2016-04-08
        • 1970-01-01
        • 1970-01-01
        • 2023-04-11
        • 2022-01-25
        • 1970-01-01
        • 2014-07-10
        相关资源
        最近更新 更多