如何从 ManagedObjectContext 中删除给定实体的所有对象

Posted

技术标签:

【中文标题】如何从 ManagedObjectContext 中删除给定实体的所有对象【英文标题】:How to delete all objects for a given entity from the ManagedObjectContext 【发布时间】:2010-04-30 20:14:02 【问题描述】:

我不想对我的 ManagedObjectContext 使用重置方法。我只需要删除特定实体的所有对象,但我没有看到任何这样做的方法。选择特定实体的所有对象并循环遍历每个对象并删除它们是可行的,但速度很慢。

【问题讨论】:

【参考方案1】:

选择特定实体的所有对象并遍历每个对象并删除它们是可行的

你就是这么干的。

【讨论】:

就这样?荒谬的。重置方法需要几毫秒,而这种循环废话可能需要很多秒。 如果您的实体与其他实体有依赖关系,则必须对其进行管理。我很确定这就是为什么它们被称为托管对象。这可能会产生一些开销。 我没有任何粗鲁的意思,只是解释为什么这些对象被称为“托管”——当你删除一个对象并保存上下文时,还有其他事情发生。如果您的删除没有快速运行,我建议您查看数据模型中的关系,特别是查看这些关系的删除规则。例如,如果您“级联”删除,这些额外事务就会产生开销。希望这会有所帮助。【参考方案2】:

类别来救援!再次。

NSManagedObjectContext+MyExtensions.h

@interface NSManagedObjectContext (MyExtensions)

-(void) deleteAllInstancesOfEntity:(NSString*) entity;

@end

NSManagedObjectContext+MyExtensions.m

#import "NSManagedObjectContext+MyExtensions.h"


@implementation NSManagedObjectContext (MyExtensions)

-(void) deleteAllInstancesOfEntity:(NSString*) entity 
     NSError* error;

     for (NSManagedObject* o in
            [self executeFetchRequest:[NSFetchRequest fetchRequestWithEntityName:entity]
                                error:&error]) 
          [o.managedObjectContext deleteObject:o];
     


@end

用法

NSManagedObjectContext *myMOC = ...;
[myMOC deleteAllInstancesOfEntity:@"SmellyCheese"];

类别很棒。

【讨论】:

以上是关于如何从 ManagedObjectContext 中删除给定实体的所有对象的主要内容,如果未能解决你的问题,请参考以下文章

如何从 managedObjectContext 中删除未保存的对象

如何从我的视图控制器引用我的 App Delegate 中的 managedObjectContext?

其他视图中的 managedObjectContext

将 ManagedObjectContext 传递/注入到视图控制器中

为啥从 UIApplicationDelegate 获取 ManagedObjectContext 的 Apple 文档不好?

从应用委托中检索 managedObjectContext 时崩溃