3

我试图找出在我的核心数据数据库中批量删除对象的最佳方法。

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

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

我怎样才能加快这个电话?通过设置不同的参数或以另一种方式设置我的模型,我可以在保存操作期间意识到并避免发生的事情吗?我注意到在此操作期间内存也会出现峰值。我真的只想“删除 * from”。

谢谢。

4

3 回答 3

1

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

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

[aContext deleteObject:aManagedObject];

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

于 2012-01-16T06:50:11.337 回答
1

假设您的核心数据模型中有一个父实体和一个子实体,并且父实体与称为子实体的子实体具有一对多关系,您应该能够在不循环的情况下删除所有子对象,如下所示:

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

或使用 Core Data 生成的方法

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

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

我不确定这是否会加快 NSManagedObjectContext 保存操作。请让我知道表演。

于 2010-05-04T18:32:46.107 回答
1

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

于 2010-05-04T17:11:08.000 回答