有没有办法根据存储在 CoreData 中的实际值来设置 NSPredicate?

Posted

技术标签:

【中文标题】有没有办法根据存储在 CoreData 中的实际值来设置 NSPredicate?【英文标题】:Is there a way to setup NSPredicate based on actual value stored in CoreData? 【发布时间】:2017-03-20 00:56:46 【问题描述】:

我需要根据存储在 CoreDate 中的实际值来设置我的 NSPredicate。

假设我们有一个 CoreData 实体:“Graduate”。如果他/她的毕业日期不为空,我们想获取毕业日期早于 Date1 的毕业生。否则,我想检查他/她的生日是否早于 Date2。

谓词如下所示:

"if graduationDate != null graduationDate < %@ else birthday < %@"

所以我实际上有两个谓词。只有当第一个谓词要检查的字段为空时,第二个才应该生效。

我的想法:

    我可以在我的 APP 而不是 CoreData 中处理它,但我想知道有没有办法只使用一个 NSPredicate 来解决它。

    一些帖子提到 NSPredicate 等同于 SQL Where 子句,这对我来说很有意义。而且我认为我在这里需要的是超越 Where Clause 的能力。

我的问题不是关于如何使用 NSPredicate 过滤获取结果。这是关于如何使用 if else 子句之类的流控制来设置 NSpredicate

【问题讨论】:

developer.apple.com/library/content/documentation/Cocoa/… 向下滚动到“筛选结果”。这个问题也被问过几次,你可以在发布新问题之前进行搜索。您还可以根据需要为多个谓词添加 NSCompoundPredicate developer.apple.com/reference/foundation/nscompoundpredicate。 如果 NSPredicate 和 NSCompoundPredicate 是“基本用法”,您能否解释一下 Core Data fetching 的高级用法以及您的要求,对于我们受教育程度较低的基本用户而言? ios CoreData NSPredicate to query multiple properties at once的可能重复 【参考方案1】:

您可以使用NSCompoundPredicate 组合较小的谓词。

    let graduates = NSPredicate.init(format: "graduationDate != NULL AND graduationDate < %@ ", graduationDate);
    let oldPeople = NSPredicate.init(format: "graduationDate == NULL AND birthday > %@ ", cutOffBirthday);
    let predicate = NSCompoundPredicate.init(orPredicateWithSubpredicates: [graduates, oldPeople]);

【讨论】:

以上是关于有没有办法根据存储在 CoreData 中的实际值来设置 NSPredicate?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我存储在 Core Data 中的布尔值没有立即显示?

CoreData 中的 Swift 数组

是否可以在开发 iphone 上查看存储在 Core Data 中的数据?

我的所有数据都没有存储在 Coredata

有没有办法在核心数据中存储 unsigned long ?

如何将多个值存储到 CoreData 中的一个属性中?