Core Data:删除实体所有实例的最快方法
Core Data:删除实体所有实例的最快方法
我正在使用Core Data来本地持久化Web服务调用结果。Web服务返回完整的对象模型,例如,“汽车” - 可能有大约2000个(我不能让Web服务返回少于1个或所有汽车的内容)。
下次我打开我的应用程序时,我想通过调用Web服务来刷新Core Data持久化的副本来获取所有汽车的信息,但为了防止重复,我需要首先清除本地缓存中的所有数据。
有没有更快的方法来清除托管对象上下文中特定实体的所有实例(例如所有类型为“CAR”的实体),还是我需要查询它们,然后遍历结果以删除每个实体,最后保存?
理想情况下,我只需说“删除所有实体为Blah的内容”。
admin 更改状态以发布 2023年5月22日
重置 Swift 3 中的实体:
func resetAllRecords(in entity : String) // entity = Your_Entity_Name { let context = ( UIApplication.shared.delegate as! AppDelegate ).persistentContainer.viewContext let deleteFetch = NSFetchRequest(entityName: entity) let deleteRequest = NSBatchDeleteRequest(fetchRequest: deleteFetch) do { try context.execute(deleteRequest) try context.save() } catch { print ("There was an error") } }
iOS 9及其以上版本:
iOS 9增加了一个名为NSBatchDeleteRequest
的新类,允许您轻松删除符合谓词的对象而无需将它们全部加载到内存中。下面是使用方法:
Swift 5
let fetchRequest: NSFetchRequest= 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];
有关批量删除的更多信息可以在来自WWDC 2015的“Core Data新功能”会话中找到(从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