我已经看到很多关于核心数据批量删除的问题,但似乎都没有解决我的问题。
我正在使用Core Data创建一个iOS 9 / Swift应用程序。在今年的WWDC上,我参加了Core Data会议,发现我可以使用NSBatchDeleteRequest
直接从持久存储中删除大量对象。这适用于某些对象,但不适用于其他对象,我认为这与我的人际关系有关。
我有一个由Subject
和Course
组成的对象图,其中存在一对多的关系。受试者可以拥有任意数量的课程。
有一个'课程' Subject
上的关系,删除规则为Cascade
,因为我希望在删除subject
时删除与subject
相关联的所有课程。
逆向是主题'在Course
上,删除规则为Nullify
。在这里,我对Apple对Nullify
:
删除对象之间的关系但不删除任何对象。 只有当员工的部门关系是可选的,或者如果您确保在下一次保存操作之前为每个员工设置新部门时,这才有意义。
这很清楚,但为什么关系会被删除而不是任何一个对象?如果我删除Course
,我希望删除Course
并删除subject
到course
之间的关系,以便删除Course
{1}}不会出现在NSSet
Subject
套courses
上。
我想提供一种方法来删除实体中的所有对象。当我通过单独提取和删除每个course
来尝试此操作时,courses
已被NSSet
上的courses
Subject
正确删除并删除。{/ 1} >
由于我不知道会有多少courses
出现,我想确保在任何情况下都能保持高性能,我想我会使用批量删除来删除所有courses
。问题是,利用NSBatchDeleteRequest
删除所有Subjects
工作正常,在此过程中删除所有courses
(由于Cascade
规则),尝试删除所有Courses
1}}使用此方法似乎可以保留所有对象。
我使用NSBatchDeleteRequest
删除了所有Courses
,但是当我查询MOC
以查看Subjects
和Courses
仍然存在时,Courses
Subject
仍然会返回1}},拥有它们的Course
仍然会引用它们。
相反,当我单独获取并删除每个Courses
时,我的后续提取会正确显示所有Subject
和“'”课程的空数组。 subjects
上的关系似乎已被正确修改。
是的,我在执行请求后保存了上下文。我想可能不会通知上下文商店的功能,但是再次删除所有{{1}}工作得很好。这是怎么回事?
答案 0 :(得分:28)
在the WWDC 2015 session which describes NSBatchDeleteRequest
,有人解释说"更改未反映在上下文中"。所以你所看到的是正常的。批量更新直接在持久性存储文件上工作,而不是通过托管对象上下文,因此上下文不了解它们。当您通过提取然后删除来删除对象时,您正在处理上下文,因此它知道您正在进行的更改(实际上它正在为您执行这些更改)。
如果您使用NSBatchDeleteResultTypeObjectIDs
,则可以使用mergeChangesFromRemoteContextSave:intoContexts:
将批量删除的结果合并回上下文,以更新您的上下文。如果您没有从上下文中加载任何其他托管对象,您也可以使用reset
。
答案 1 :(得分:2)
我最后添加了以下内容,以便在批量删除后处理上下文。
[self.managedObjectContext refreshAllObjects];