删除所有核心数据记录,未在 ManagedContext 中设置 hasChanges

Rei*_*ner 4 core-data nsmanagedobjectcontext ios

我是 coreData 的新手,我有一个问题:

我的应用程序执行以下 3 个连续的核心数据函数:

    let managedContext = persistentContainer.viewContext
    deleteAllCDRecords(managedContext: managedContext, in: "CDShoppingItem")
    saveManagedContext(managedContext: managedContext)  
Run Code Online (Sandbox Code Playgroud)

它们定义(缩写)为:

private func deleteAllCDRecords(managedContext: NSManagedObjectContext, in entity: String) {
    let deleteFetch = NSFetchRequest<NSFetchRequestResult>(entityName: entity)
    let deleteRequest = NSBatchDeleteRequest(fetchRequest: deleteFetch)
    do {
        try managedContext.execute(deleteRequest)
    } catch let error as NSError {
        // error handling
    }
} // deleteAllCDRecords  
Run Code Online (Sandbox Code Playgroud)

private func saveManagedContext(managedContext: NSManagedObjectContext) {
    if !managedContext.hasChanges { return }
    do {
        try managedContext.save()
    } catch let error as NSError {
        // error handling
    }
} // saveManagedContext  
Run Code Online (Sandbox Code Playgroud)

问题:

deleteAllCDRecords执行后, managedContext.hasChangesin functionsaveManagedContext 不为 true,因此删除不会保存到持久存储中。

我的问题:
我的代码有什么问题?

And*_*tta 6

批量删除在持久存储本身中进行操作。因此,在这种特殊情况下,您从持久存储中删除实体,然后必须删除内存中的对象。

批量删除比在代码中自行删除核心数据实体运行得更快,因为它们在 SQL 级别的持久存储本身中进行操作。作为此差异的一部分,对持久存储进行的更改不会反映在当前内存中的对象中。

执行批量删除后,删除内存中已从持久存储中删除的所有对象。

请参阅https://developer.apple.com/library/archive/featuredarticles/CoreData_Batch_Guide/BatchDeletes/BatchDeletes.html