首页 文章

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

提问于
浏览
0

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

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

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

3 回答

  • 0

    如果您具有对象的实际managedObjectID,则可以使用 -[NSMangedObjectContext objectForID:] 仅从DB获取该特定对象 . 这比获取每个对象更快 .

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

  • 0

    “fetched property”旨在帮助解决这类问题,它允许您访问相关对象,就好像它是直接关系一样,但在请求之前它不会执行获取 . 他们只是一种关系 .

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

  • 0

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

    [NSManagedObjectContext objectForID:]将向您返回一个错误,然后您可以使用该错误作为对象传递给关系,但只要您设置关系的一侧,对象就会发生故障 .

    我不确定您使用了多少数据,但如果您的实体足够轻,理论上可以将它们全部存入内存并在那里进行排序/搜索(NSArray NSPredicate) .

相关问题