核心数据NSBatchDeleteRequest似乎在上下文

时间:2015-11-04 23:04:11

标签: ios core-data

我已经看到很多关于核心数据批量删除的问题,但似乎都没有解决我的问题。

我正在使用Core Data创建一个iOS 9 / Swift应用程序。在今年的WWDC上,我参加了Core Data会议,发现我可以使用NSBatchDeleteRequest直接从持久存储中删除大量对象。这适用于某些对象,但不适用于其他对象,我认为这与我的人际关系有关。

我有一个由SubjectCourse组成的对象图,其中存在一对多的关系。受试者可以拥有任意数量的课程。

有一个'课程' Subject上的关系,删除规则为Cascade,因为我希望在删除subject时删除与subject相关联的所有课程。

逆向是主题'在Course上,删除规则为Nullify。在这里,我对Apple对Nullify

的描述感到有些困惑
  

删除对象之间的关系但不删除任何对象。   只有当员工的部门关系是可选的,或者如果您确保在下一次保存操作之前为每个员工设置新部门时,这才有意义。

这很清楚,但为什么关系会被删除而不是任何一个对象?如果我删除Course,我希望删除Course并删除subjectcourse之间的关系,以便删除Course {1}}不会出现在NSSet Subjectcourses上。

我想提供一种方法来删除实体中的所有对象。当我通过单独提取和删除每个course来尝试此操作时,courses已被NSSet上的courses Subject正确删除并删除。{/ 1} >

由于我不知道会有多少courses出现,我想确保在任何情况下都能保持高性能,我想我会使用批量删除来删除所有courses。问题是,利用NSBatchDeleteRequest删除所有Subjects工作正常,在此过程中删除所有courses(由于Cascade规则),尝试删除所有Courses 1}}使用此方法似乎可以保留所有对象。

我使用NSBatchDeleteRequest删除了所有Courses,但是当我查询MOC以查看SubjectsCourses仍然存在时,Courses Subject仍然会返回1}},拥有它们的Course仍然会引用它们。

相反,当我单独获取并删除每个Courses时,我的后续提取会正确显示所有Subject和“'”课程的空数组。 subjects上的关系似乎已被正确修改。

是的,我在执行请求后保存了上下文。我想可能不会通知上下文商店的功能,但是再次删除所有{{1}}工作得很好。这是怎么回事?

2 个答案:

答案 0 :(得分:28)

the WWDC 2015 session which describes NSBatchDeleteRequest,有人解释说"更改未反映在上下文中"。所以你所看到的是正常的。批量更新直接在持久性存储文件上工作,而不是通过托管对象上下文,因此上下文不了解它们。当您通过提取然后删除来删除对象时,您正在处理上下文,因此它知道您正在进行的更改(实际上它正在为您执行这些更改)。

如果您使用NSBatchDeleteResultTypeObjectIDs,则可以使用mergeChangesFromRemoteContextSave:intoContexts:将批量删除的结果合并回上下文,以更新您的上下文。如果您没有从上下文中加载任何其他托管对象,您也可以使用reset

答案 1 :(得分:2)

我最后添加了以下内容,以便在批量删除后处理上下文。

[self.managedObjectContext refreshAllObjects];