NSBatchDeleteRequest 删除所有子实体
NSBatchDeleteRequest deletes all child entities
我的 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对象。
在我看来这像是一个错误。如果启用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 甚至优化了 true 谓词,只留下 WHERE 子句来限制对正确实体的删除。
我的 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对象。
在我看来这像是一个错误。如果启用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 甚至优化了 true 谓词,只留下 WHERE 子句来限制对正确实体的删除。