NSBatchDeleteRequest删除所有子实体

时间:2017-12-11 13:27:10

标签: swift core-data nsbatchdeleterequest

我的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对象。

1 个答案:

答案 0 :(得分:3)

这对我来说就像一个错误。如果启用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子句来限制删除到正确的实体。