核心数据性能deleteObject并保存托管对象上下文

时间:2010-05-04 16:56:16

标签: iphone core-data nsmanagedobjectcontext

我正在尝试找出批量删除Core Data数据库中对象的最佳方法。

我有一些父/子关系的对象。有时我需要通过清除所有现有子对象并向Core Data添加新对象来“刷新”父对象。此操作的“全部删除”部分是我遇到麻烦的地方。 我通过遍历子节点并为每个子节点调用deleteObject来实现此目的。

我注意到在NSManagedObjectContext之后:当我删除15,000个对象时,所有deleteObject调用之后的Save调用非常慢。

如何加快通话速度?在保存操作期间是否有我可以注意到的事情并通过设置不同的参数或以另一种方式设置我的模型来避免?我注意到在此操作期间内存也会出现峰值。我真的只想“删除*”。

感谢。

3 个答案:

答案 0 :(得分:1)

检查关系依赖关系图:初始删除触发的级联删除会减慢速度。如果不需要删除,则更改删除规则。

答案 1 :(得分:1)

假设您的Core Data模型中有父实体和子实体,并且父实体与子项称为子项之间存在多对多关系,则应该能够删除所有子对象而不进行循环,如下所示: / p>

NSManagedObject *parentObject = ...;
[parentObject setValue:nil forKey:@"children"];

或使用Core Data生成的方法

- (void)removeChildren:(NSSet *)value;

NSSet *children = [parentObject valueForKey:@"children"];
[parentObject removeChildren:children];

我不确定这是否会加快NSManagedObjectContext保存操作。请告诉我有关表演的事。

答案 2 :(得分:1)

根据苹果网站:http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdCreateMOs.html 这很简单:

删除托管对象非常简单。您只需将其托管对象上下文发送一个deleteObject:消息,将要删除的对象作为参数传递。

[aContext deleteObject:aManagedObject];

这将从对象图中删除托管对象。正如在保存上下文之前不会将新对象保存到存储中一样,在保存上下文之前,不会从存储中删除已删除的对象。