Core Data:删除实体所有实例的最快方法

4 浏览
0 Comments

Core Data:删除实体所有实例的最快方法

我正在使用Core Data来本地持久化Web服务调用结果。Web服务返回完整的对象模型,例如,“汽车” - 可能有大约2000个(我不能让Web服务返回少于1个或所有汽车的内容)。

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

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

理想情况下,我只需说“删除所有实体为Blah的内容”。

admin 更改状态以发布 2023年5月22日
0
0 Comments

重置 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")
        }
    }

0
0 Comments

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

0