【问题标题】:NSBatchDeleteRequest deletes all child entitiesNSBatchDeleteRequest 删除所有子实体
【发布时间】:2017-12-11 13:27:10
【问题描述】:

我的 CoreData 模型有两个子实体“CarA”和“CarB”,它们具有相同的抽象父实体“Car”。

我正在尝试使用删除所有 CarA 对象

    func deleteObjects(entityName: String) {
        let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: entityName)
        let deleteRequest = NSBatchDeleteRequest(fetchRequest: fetchRequest)
        do {
            try context.execute(deleteRequest)
        } catch let error as NSError {
            print(error)
        }
    }

执行deleteObjects("CarA") 不仅会删除所有 CarA 对象,还会删除所有 CarB 对象。

【问题讨论】:

    标签: swift core-data nsbatchdeleterequest


    【解决方案1】:

    在我看来,这就像一个错误。如果启用 SQLDebug,从控制台输出可以看到整个父实体都被删除了:

    CoreData: sql: BEGIN EXCLUSIVE
    CoreData: sql: DELETE FROM ZABSTRACT
    CoreData: sql: COMMIT
    

    (我的父实体名为“Abstract”)。但我注意到,如果您添加谓词,CoreData 会记住限定底层提取以将其限制为正确的子实体。所以一种解决方法是添加一个始终为真的谓词:

    fetchRequest.predicate = NSPredicate(value:true)
    

    得到的控制台输出是:

    CoreData: sql: BEGIN EXCLUSIVE
    CoreData: sql: DELETE FROM ZABSTRACT WHERE Z_PK IN (SELECT t0.Z_PK FROM ZABSTRACT t0 WHERE  t0.Z_ENT = ? )
    CoreData: sql: COMMIT
    

    CoreData 似乎甚至优化了真正的谓词,只留下 WHERE 子句来限制删除到正确的实体。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-30
      • 1970-01-01
      • 2013-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-20
      相关资源
      最近更新 更多