NSPredicate 用于检查与其他变量匹配的 CoreData 属性是不是满足条件

Posted

技术标签:

【中文标题】NSPredicate 用于检查与其他变量匹配的 CoreData 属性是不是满足条件【英文标题】:NSPredicate for checking if a CoreData attribute matched with other variable satisfy a criteriaNSPredicate 用于检查与其他变量匹配的 CoreData 属性是否满足条件 【发布时间】:2012-01-03 19:08:34 【问题描述】:

我有一个包含三个字段的实体

Task 
   Active BOOL
   Recurrent Int
   Started date

'Recurrent' 是任务发生的延迟。如果任务具有给定的“已开始”且“重复”为 15,则意味着必须在“已开始”后 15 天重复该任务。 我想构建一个 NSPredicate 来查找在给定日期需要执行的所有实体。

例如,假设商店中有一个实体,'Started' = 15/12/2011 'Recurrent' = 15,然后在 29/12/2011 查询 CoreData 没有结果。在 2011 年 12 月 30 日进行查询将给出结果,因为距离“开始”已过去 15 天。

我可以通过一些数学运算轻松地用 SQL 处理这个问题,但我完全不知道如何使用 NSPredicate 来完成这个,因为查询是直接在字段上完成的。 我想继续使用 NSPredicate,因为它是一个带有 UITableView 的 ios 应用程序,我计划使用 NSFetchedResultsController,但如果不可能,一个实体的 NSArray 就可以了。

谢谢

【问题讨论】:

【参考方案1】:

“简单”的答案是将recurrent 也存储为日期。或者存储一个recurrentResolved 值,它是一个日期并针对它进行获取。

不太容易和丑陋的选择是加载所有任务并在内存中进行计算(以一种方便的方法),然后对对象执行第二次NSPredicate。一旦它们被加载到内存中,您的NSPredicate 就可以利用您子类中的方法。

我会推荐第一个选项。第二个要贵得多。

【讨论】:

这里也可以使用 predicateWithBlock 吗?不过,我同意你的第一个选项是最好的。 在对象被提取到内存之后是的。期间NSFetchRequest;不,这会转化为实际的 SQL。 我知道这是我的错,但是在使用CoreData时,迟早会把我带入死胡同。我不知道第一个选项,我需要在 UITable 中使用这个东西,它可以填充任何未来或过去的日期。这就是计算的需要。带有自定义函数的 NSExpression 呢? 您无法在 NSFetchRequest 中进行计算。没有例外或解决方法。这是一个限制,您可以提交雷达,但该功能不存在。因此,您有两个选择;预先计算值或过滤两次。

以上是关于NSPredicate 用于检查与其他变量匹配的 CoreData 属性是不是满足条件的主要内容,如果未能解决你的问题,请参考以下文章

NSPredicate 用于 NSFetchRequest 中的多个匹配项

NSPredicate 与字符串完全匹配

将 NSPredicate 与字符串匹配

NSPredicate 用于检查核心数据中的 NULL 和空白字符串

NSPredicate 和 BEGINSWITH with CloudKit:字段值类型不匹配

NSPredicate 匹配反斜杠