我在 SO 中进行了搜索,但没有找到任何建议来提高在处理关系时删除 Core Data 中的托管对象的性能。
场景非常简单。
如您所见,存在三个不同的实体。每个实体都与下一个实体级联。例如,FirstLevel
有一个名为secondLevels
to的关系SecondLevel
。从FirstLevel
to的删除规则SecondLevel
是Cascade而从SecondLevel
to的删除规则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];
}
利用级联规则,图被删除。这对少数对象快速有效,但会降低许多对象的性能。另外,我认为(但我不太确定)这种类型的删除对磁盘执行了很多往返,我错了吗?
所以,我的问题如下:如何在不利用级联规则和提高性能的情况下删除图形,但同时保持图形一致性?
先感谢您。
编辑
我无法删除整个文件,因为我的模型中有其他实体。
编辑 2
我发布的代码包装在子类的main
方法中NSOperation
。此解决方案允许在后台执行删除阶段。由于我利用了级联规则,因此删除是以半自动方式执行的。FirstLevel
我只通过发布代码中的 for 循环删除根对象,即项目。这样Core Data就为我做剩下的事情了。我想知道的是:是否可以绕过半自动删除操作并手动执行而不丢失图形一致性?