gpt4 book ai didi

swift - NSBatchDeleteRequest 删除所有子实体

转载 作者:搜寻专家 更新时间:2023-10-31 22:25:53 26 4
gpt4 key购买 nike

我的 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

(我的父实体名为“抽象”)。但我注意到,如果您添加谓词,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 子句以将删除限制为正确的实体。

关于swift - NSBatchDeleteRequest 删除所有子实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47754019/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com