删除所有核心数据记录未在ManagedContext

时间:2019-01-21 19:32:07

标签: ios core-data nsmanagedobjectcontext

我是coreData的新手,但我遇到了问题:

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

    let managedContext = persistentContainer.viewContext
    deleteAllCDRecords(managedContext: managedContext, in: "CDShoppingItem")
    saveManagedContext(managedContext: managedContext)  

它们的定义(简称)为:

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  

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

问题:

执行deleteAllCDRecords后,函数managedContext.hasChanges中的saveManagedContext 不正确,因此删除操作不会保存到持久性存储中。

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

1 个答案:

答案 0 :(得分:3)

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

  

批量删除比您自己删除Core Data实体运行得更快   在代码中使用,因为它们在持久性存储本身中进行操作,   SQL级别。作为这种差异的一部分,对   持久性存储未反映在当前的对象中   在内存中。

     

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

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