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

时间:2011-03-18 18:51:24

标签: ios core-data

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

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

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

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

请参阅:Fetched Properties v Relationships (Core Data - iPhone)

答案 2 :(得分:0)

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

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

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