【发布时间】:2020-11-03 11:07:39
【问题描述】:
所以我有一个核心数据实体“事务”,其属性“标签”与另一个实体“标签”相关。两个实体之间的关系类型是多对多的。这意味着一个交易可以有很多标签,一个标签可以有很多交易。
现在,我创建了一个基于特定标签获取交易条目的方法。该方法如下所示:
func transactions(withTags tags: [Tag] = [], matchCriteria: String = "ANY") {...}
所以在函数中,我使用了如下谓词:
predicate = NSPredicate(format: "(%@ <= date) AND (date < %@) AND (\(matchCriteria) tags IN %@)", argumentArray: [startDate, endDate, tags])
所以谓词中的关键元素是“ANY tags IN %@”,它基本上只搜索给定的标签,如果在条目中找到任何这些标签,那么就会有匹配。这个谓词非常适合这个目的。
但是现在,我想做的是有一个类似的谓词,但是,我希望它仅在找到所有给定标签时才返回匹配项。例如,如果我有 2 个标签,例如“计划”和“付费”。然后只返回带有两个标签的条目。
因此,根据此处https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/Predicates/Articles/pSyntax.html#//apple_ref/doc/uid/TP40001795 的 Apple 文档,似乎有一个“ALL”运算符。所以我尝试创建一个类似于下面的谓词:
predicate = NSPredicate(format: "(%@ <= date) AND (date < %@) AND (ALL tags IN %@)", argumentArray: [startDate, endDate, tags])
刚刚将 ANY 替换为 ALL。但它似乎不起作用,它使我的应用程序崩溃。我得到的错误是“线程 1:异常:“不支持的谓词...”。这是我卡住的地方,希望你们能指出我正确的方向。
满足上述要求的正确谓词应该是什么?
【问题讨论】:
标签: ios swift iphone core-data nspredicate