有没有办法使用 NSPredicate 在核心数据中发出 NSDeleteRequest 与 NSFetchRequest ?

Posted

技术标签:

【中文标题】有没有办法使用 NSPredicate 在核心数据中发出 NSDeleteRequest 与 NSFetchRequest ?【英文标题】:Is there a way to use NSPredicate to issue an NSDeleteRequest vs. an NSFetchRequest in Core Data? 【发布时间】:2009-08-11 22:46:37 【问题描述】:

我认为 NSDeleteRequest 类不存在,但我希望它存在。

我可以创建一个 NSPredicate 并使用 NSFetchRequest 发出:

select * from foo where x=y

我该如何发布:

从 x=y 的 foo 中删除

?

删除 1000 行的唯一方法似乎是获取它们,循环遍历它们,然后在每个 NSManagedObject 上调用 delete。是对的吗?为什么我不能只发出 1 个删除 sql 语句?

【问题讨论】:

您必须遍历数组并一次删除一个,但只需告诉托管对象上下文您正在执行批处理作业并且您不需要任何撤消支持立即保存。这应该不是问题。如果是,那么您使用 CoreData 不正确,可能需要考虑使用直接 sqlite 或 RDBMS。 【参考方案1】:

您必须获取托管对象,然后将-deleteObject: 发送到要删除的每个对象的上下文。

必须将对象提取到内存中,以便 Core Data 能够遵守在关系上指定的级联或无效规则。

如果您在删除时遇到特定的性能问题(超出所需的提取),那么在 Instruments 中分析操作会很有帮助。如果您在应用级联/无效规则时单独触发错误,则预取相关对象将提高性能。

【讨论】:

【参考方案2】:

您可以将类别方法 -(executeDeleteWithRequest:error:) 添加到 NSManagedObjectContext。

当然,您仍然需要进行循环,但至少它可以将问题抽象出来并干燥您的代码。

【讨论】:

以上是关于有没有办法使用 NSPredicate 在核心数据中发出 NSDeleteRequest 与 NSFetchRequest ?的主要内容,如果未能解决你的问题,请参考以下文章

核心数据 - NSPredicate 过滤掉工作不正确的空字符串

核心数据 - 为啥我的 NSPredicate 没有产生正确的 SQL 查询?

保存核心数据相关数据并使用具有多个实体的 NSPredicate 和 NSFetchedResultsController 检索

有没有办法在 UITest 中使用 valueForKey 和 NSPredicate?

核心数据:在两个实体中查找的 NSPredicate

核心数据,NSPredicate,任何 key.path == nil