ios - 核心数据 : Quickest way to delete all instances

我正在使用 Core Data 在本地保存来自 Web 服务调用的结果。 Web 服务返回完整的对象模型,比如说“汽车”——可能是大约 2000 辆(我不能让 Web 服务返回少于 1 辆或所有汽车的任何东西。

下次我打开我的应用程序时,我想通过再次调用所有汽车的 Web 服务来刷新 Core Data 持久副本,但是为了防止重复,我需要先清除本地缓存中的所有数据。

是否有更快的方法来清除托管对象上下文中特定实体的所有实例(例如“CAR”类型的所有实体),或者我是否需要查询它们调用,然后遍历结果以删除每个实例,然后保存?

理想情况下,我可以说删除所有实体为 Blah 的位置。

最佳答案

iOS 9 及更高版本:

iOS 9 添加了一个名为 NSBatchDeleteRequest 的新类,它允许您轻松删除与谓词匹配的对象,而无需将它们全部加载到内存中。以下是您的使用方法:

swift 5

let fetchRequest: NSFetchRequest<NSFetchRequestResult> = NSFetchRequest(entityName: "Car")
let deleteRequest = NSBatchDeleteRequest(fetchRequest: fetchRequest)

do {
    try myPersistentStoreCoordinator.execute(deleteRequest, with: myContext)
} catch let error as NSError {
    // TODO: handle the error
}

objective-C

NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"Car"];
NSBatchDeleteRequest *delete = [[NSBatchDeleteRequest alloc] initWithFetchRequest:request];

NSError *deleteError = nil;
[myPersistentStoreCoordinator executeRequest:delete withContext:myContext error:&deleteError];

更多关于批量删除的信息可以在 "What's New in Core Data" session from WWDC 2015 中找到。 (从 ~14:10 开始)。

iOS 8 及更早版本:

获取全部并删除它们:

NSFetchRequest *allCars = [[NSFetchRequest alloc] init];
[allCars setEntity:[NSEntityDescription entityForName:@"Car" inManagedObjectContext:myContext]];
[allCars setIncludesPropertyValues:NO]; //only fetch the managedObjectID

NSError *error = nil;
NSArray *cars = [myContext executeFetchRequest:allCars error:&error];
[allCars release];
//error handling goes here
for (NSManagedObject *car in cars) {
  [myContext deleteObject:car];
}
NSError *saveError = nil;
[myContext save:&saveError];
//more error handling here

关于ios - 核心数据 : Quickest way to delete all instances of an entity,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1383598/

相关文章:

objective-c - 如何纯粹用 C 编写 iOS 应用程序

objective-c - 如何使用 NSTimer?

iphone - 您在编写 Objective-C 和 Cocoa 时使用了哪些最佳实践?

ios - Objective-C ARC : strong vs retain and weak

objective-c - 在 Objective-C 中为类定义私有(private)方法的最佳方

ios - iPad 多任务支持需要这些方向

objective-c - 如果您使用 CocoaPods,您的 .gitignore 会包含什么内

iphone - 按下时 UILongPressGestureRecognizer 被调用两次

ios - 创建模糊叠加 View

iphone - 如何在 UIView 下绘制阴影?