Ios 核心数据NSBatchDeleteRequest似乎将对象保留在上下文中
我在核心数据中看到了许多关于批量删除的问题,但似乎没有一个能解决我的问题 我正在使用核心数据创建iOS 9/Swift应用程序。在今年的WWDC上,我参加了核心数据会议,发现我可以使用Ios 核心数据NSBatchDeleteRequest似乎将对象保留在上下文中,ios,core-data,Ios,Core Data,我在核心数据中看到了许多关于批量删除的问题,但似乎没有一个能解决我的问题 我正在使用核心数据创建iOS 9/Swift应用程序。在今年的WWDC上,我参加了核心数据会议,发现我可以使用NSBatchDeleteRequest直接从持久存储中删除大量对象。这对我来说适用于某些对象,但对其他对象不适用,我认为这与我的关系有关 我有一个由主题和课程组成的对象图,其中存在一对多关系。受试者可以拥有任意数量的课程 主题上存在“课程”关系,删除规则为级联,因为我希望删除主题时删除与主题相关的所有课程 相反的
NSBatchDeleteRequest
直接从持久存储中删除大量对象。这对我来说适用于某些对象,但对其他对象不适用,我认为这与我的关系有关
我有一个由主题
和课程
组成的对象图,其中存在一对多关系。受试者可以拥有任意数量的课程
主题
上存在“课程”关系,删除规则为级联
,因为我希望删除主题
时删除与主题
相关的所有课程
相反的是课程
上的“主题”,删除规则为无效
。在这里,我对苹果对Nullify
的描述有点困惑:
删除对象之间的关系,但不要删除任何一个对象。
只有当员工的部门关系是可选的,或者确保在下一次保存操作之前为每个员工设置了新部门时,这才有意义
这就很清楚了,但是为什么要删除关系,而不是任何一个对象?如果我删除了课程
,我希望删除课程
,并删除主题
与课程
之间的关系,以便删除的课程
的故障不会出现在主题
课程集的NSSet
中
我想提供一种删除实体中所有对象的方法。当我通过单独获取和删除每个课程
来尝试此操作时,课程
会被正确地删除,并从主题
的课程
的NSSet
中删除
由于我不知道将有多少课程
,并且我希望在每种情况下都能确保高性能,因此我决定使用批删除来删除所有课程
。问题是,当使用NSBatchDeleteRequest
删除所有主题
时,删除所有课程
效果良好(由于级联
规则),尝试使用此方法删除所有课程
似乎会保留所有对象
我使用NSBatchDeleteRequest
删除所有课程
,但当我查询MOC
查看哪些科目
和课程
仍然存在时,两个课程
仍然返回,拥有它们的科目
仍然有对它们的引用
相反,当我分别获取和删除每个课程
时,我随后的获取会正确地显示所有课程
的空数组,并且主题
上的“课程”关系似乎已被正确修改
是的,我正在执行请求后保存上下文。我想上下文可能不会被通知商店做了什么,但是再次删除所有主题
效果很好。这里发生了什么?当时,有人解释说“变化不会反映在上下文中”。所以你看到的是正常的。批处理更新直接在持久存储文件上工作,而不是通过托管对象上下文,因此上下文不知道它们。当您通过获取然后删除来删除对象时,您正在处理上下文,因此它知道您正在进行的更改(事实上,它正在为您执行这些更改)
如果使用
nsBatchDeleteResultTypeObjectId
,则可以使用mergeChangesFromRemoteContextSave:intoContexts:
更新上下文,将批量删除的结果合并回上下文。如果没有从上下文加载任何其他托管对象,则也可以使用重置。我最后添加了以下内容,以在批删除后处理上下文
[self.managedObjectContext refreshAllObjects];
谢谢我用了重置,它工作了。在看到您的答案之前,我确实看到SQLite数据库中缺少课程,应用程序在重新启动时反映了这一点。为了安全起见,我想切换到mergeChanges方法。我有一份批量删除结果的副本,我已将其设置为返回NSBatchDeleteResultTypeObjectID
。对于mergechangesfrommotecontextsave
上的changeNotificationData:[NSObject:AnyObject]
我应该传递什么?好的,而不是使用nsbatchdeletesulttypeobjectid
,我注册了NSManagedObjectContextDidSaveNotification
,并从块中调用了mergeChangesFromRemoteContextSave
。@MatthewS这对您有用吗?根据文件和会议视频(WWDC 2015),这不应该起作用。批删除请求绕过托管对象上下文,这意味着不会发送任何反映批删除请求所做更改的通知。@BartJacobs是的,这对我适用。使用此通知观察方法,这些更改似乎反映在上下文中。这可能是因为我直接在我的上下文实例上调用了executeRequest
。批删除忽略删除规则。这不行