我们有一个流程需要更新现有核心数据存储以添加子关系。我们已经拥有一个名为人类的实体,但现在我们已经增加了将人类作为其他人的父母联系起来的能力。到目前为止,我们这样做的方法是首先获取将成为父项的人,然后获取将成为子项的人,然后将子项添加到父对象上名为“children”的NSSet *属性中。然而,这需要从核心数据中获取子AND和父项,这很慢,特别是考虑到我们可能有数万个对象。
父/子关系是一项新功能,我们从服务器的xml流中获取关系数据。它基本上包含每个人的整数id和他们孩子的人的整数列表。
有没有办法在不带孩子的情况下创建这种关系?你可以使用NSManagedObjectID或其他标识符创建这样的关系吗?或者您是否必须从核心数据中获取整个对象?我们确切知道的一件事是所有人类对象都保证在核心数据中,因此永远不需要创建新的人类对象,它们都已经存在于核心数据存储中。
答案 0 :(得分:0)
如果您拥有对象的实际managedObjectID,则可以使用-[NSMangedObjectContext objectForID:]
仅从DB获取该特定对象。这比获取每个对象要快。
但是,如果没有这两个对象,就无法设置关系。
答案 1 :(得分:0)
“fetched property”旨在帮助解决这类问题,它允许您访问相关对象,就像它是直接关系一样,但在请求之前它不会进行提取。他们只是一种关系。
答案 2 :(得分:0)
无法在不导致故障的情况下设置多对多关系的值。调用对象级别setter(例如addParent:(Human *)parent)或直接操作set将触发错误。 CoreData必须这样做以确保关系完整性。
[NSManagedObjectContext objectForID:]会向您返回一个错误,然后您可以将其作为对象传递给关系,但是只要设置关系的一侧,对象就会出错。
我不确定您使用了多少数据,但如果您的实体足够轻,理论上可以将它们全部存入内存并在那里进行排序/搜索(NSArray + NSPredicate)。