【发布时间】:2012-04-28 14:00:52
【问题描述】:
我在 SO 中进行了搜索,但没有找到任何建议来提高在处理关系时删除 Core Data 中的托管对象的性能。
场景很简单。
如您所见,共有三个不同的实体。每个实体都与下一个实体级联。例如,FirstLevel 与 SecondLevel 之间的关系称为 secondLevels。从FirstLevel 到SecondLevel 的删除规则是Cascade,而从SecondLevel 到FirstLevel 的删除规则是Nullify。在SecondLevel 和ThirdLevel 之间应用相同的规则。
当我想删除整个图表时,我执行如下方法:
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"FirstLevel" inManagedObjectContext:context];
[fetchRequest setEntity:entity];
NSError *error = nil;
NSArray *items = [context executeFetchRequest:fetchRequest error:&error];
[fetchRequest release];
// delete roots object and let Core Data to do the rest...
for (NSManagedObject *managedObject in items) {
[context deleteObject:managedObject];
}
利用 Cascade 规则删除图形。这对少数对象快速有效,但会降低许多对象的性能。另外,我认为(但我不太确定)这种类型的删除对磁盘执行了很多往返,我错了吗?
所以,我的问题如下:如何在不利用 Cascade 规则和提升性能的情况下删除图形,同时保持图形一致性?
提前谢谢你。
编辑
我无法删除整个文件,因为我的模型中有其他实体。
编辑 2
我发布的代码包含在NSOperation 子类的main 方法中。此解决方案允许在后台执行删除阶段。由于我利用了 Cascade Rule,因此删除是以半自动方式执行的。我只通过发布代码中的 for 循环删除根对象 FirstLevel 项。这样Core Data就为我做剩下的事情了。我想知道的是:是否可以绕过半自动删除操作并手动执行而不丢失图形一致性?
【问题讨论】:
-
你想删除整个图表,我的意思是,清除所有持久存储,还是只清除一些分支?
-
+1 为您的链接。问题是我无法删除整个文件,因为我的模型中有其他实体。我对我的问题添加了一个编辑。谢谢。
标签: ios performance core-data cascading-deletes object-relationships