代码之家  ›  专栏  ›  技术社区  ›  Reinhard Männer

删除所有核心数据记录不会在ManagedContext中设置HasChanges

  •  2
  • Reinhard Männer  · 技术社区  · 6 年前

    我刚接触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 回复  |  直到 6 年前
        1
  •  3
  •   André Slotta    6 年前

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

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

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

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