2015-11-04 99 views
9

我在核心数据中看到了很多有关批量删除的问题,但似乎没有一个能解决我的问题。核心数据NSBatchDeleteRequest似乎在上下文中留下对象

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

我具有由SubjectCourse,那里有一对多的关系的对象图。受试者可以拥有任意数量的课程。

有一个“课程”上SubjectCascade删除规则的关系,因为我想用一个subject相关联的所有课程时,一个subject被删除到被删除。

Course上的反例是'subject',其删除规则为Nullify。在这里,我有点困惑,因为苹果的描述Nullify

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

这使得它很清楚,但为什么要删除关系但不是两个对象?如果我删除Course,我想Course被删除,而从subjectcourse的关系被删除,这样的故障已删除的Course不会在NSSetSubjectcourses集出现。

我想提供一种方法来删除实体中的所有对象。当我尝试通过单独提取和删除coursecourses被正确删除并从NSSetcoursesSubject中删除。

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

我以前NSBatchDeleteRequest删除所有Courses,但后来当我查询MOC看什么SubjectsCourses依然存在,仍返回两个CoursesSubject拥有他们仍然对它们的引用。

相反,当我取,并分别删除每个Course,我后来取正常显示所有Courses并在Subject的“课程”的关系似乎已经适当修改一个空数组。

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

+0

批删除无视删除规则。 https://stackoverflow.com/questions/32915874/can-i-use-nsbatchdeleterequest-on-entities-with-relationships-that-have-delete-r/46073965#46073965 – LShi

回答

24

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

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

+0

谢谢!我用重置,它的工作。在看到您的答案之前,我确实发现SQLite数据库中缺少课程,应用程序在重新启动时反映了这一点。 –

+0

我想切换到mergeChanges方法的安全。我有一个批处理删除结果的副本,我已将其设置为“NSBatchDeleteResultTypeObjectID”。我在'mergeChangesFromRemoteContextSave'上为'changeNotificationData:[NSObject:AnyObject]传递了什么? –

+0

好吧,而不是使用'NSBatchDeleteResultTypeObjectID',我注册了'NSManagedObjectContextDidSaveNotification',并从块中调用'mergeChangesFromRemoteContextSave'。 –

2

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

[self.managedObjectContext refreshAllObjects];