核心数据NSBatchDeleteRequest似乎在上下文中保留对象

Mat*_*man 15 core-data ios

我在Core Data中看到了很多关于批量删除的问题,但似乎没有一个问题可以解决我的问题.

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

我有一个由Subject和组成的对象图Course,其中有一对多的关系.受试者可以拥有他们希望的许多课程.

Subject删除规则存在"课程"关系Cascade,因为我希望subject在删除a时subject删除与a关联的所有课程.

反向是"主题" Course,删除规则为Nullify.在这里,我对Apple的描述有点困惑Nullify:

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

这很清楚,但为什么关系会被删除而不是任何一个对象呢?如果我删除Course,我希望Course被删除,从关系subjectcourse被删除,这样的故障,以删除Course不会在显示NSSetSubjectcourses设置.

我想提供一种方法来删除实体中的所有对象.当我尝试这通过单独读取和删除每一个course,courses将正确地删除,并从取出NSSetcourses一个Subject.

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

我曾经NSBatchDeleteRequest删除所有Courses,但是当我查询MOC以查看什么Subjects并且Courses仍然存在时,两者Courses仍然被返回并且Subject拥有它们仍然具有对它们的引用.

相反,当我Course单独获取和删除每个时,我的后续获取正确显示所有的空数组,Courses并且Subject看起来已经正确修改了"课程"关系.

是的,我在执行请求后保存上下文.我想上下文可能不会被通知商店的功能,但是再次删除所有功能都subjects很好.这里发生了什么?

Tom*_*ton 28

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

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