提问人:Cris Denopol 提问时间:7/14/2020 最后编辑:NimanthaCris Denopol 更新时间:11/28/2021 访问量:92
如何使用带有 ALL 的谓词获取数据 ...IN 格式字符串
How to fetch data using predicate with the ALL ... IN format string
问:
因此,我有一个核心数据实体“transaction”,其属性“tags”与另一个实体“tag”相关。两个实体之间的关系类型是多对多的。这意味着一个交易可以有多个标签,一个标签可以有多个交易。
现在,我创建了一个基于特定标签获取事务条目的方法。该方法如下所示:
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])
只是用 ALL 替换了 ANY。但它似乎不起作用,它使我的应用程序崩溃。我得到的错误是“线程 1:异常:”不支持的谓词...”。这就是我卡住的地方,希望你们能为我指出正确的方向。
我应该使用什么谓词来满足上述要求?
答:
首先请注意,即使它没有崩溃,您的谓词(“ALL tags in %@”,tags)也不会完全按照您的意愿行事。它将确保只有当事务的所有标签都在列表中时,事务才包含在结果中。但是,如果它只有一个标签,并且仅与列表中的一个标签匹配,则它仍将包含在内。您需要的是相反的情况(“ALL %@ IN tags”)。但这将导致同样的崩溃。
实现您想要的最简单方法是准备一个复合谓词,依次从列表中获取每个标签,例如:
"(ANY tags == 'planned') AND (ANY tags == 'paid')"
您可以相当快速地为数组构建它:tags
let datePredicateArray = [NSPredicate(format: "(%@ <= date) AND (date < %@)", argumentArray: [startDate, endDate])]
let tagPredicateArray = tags.map {NSPredicate(format:"ANY tags == %@", $0)}
let allPredicates = datePredicateArray + tagPredicateArray
let finalPredicate = NSCompoundPredicate(andPredicateWithSubpredicates: allPredicates)
评论
上一个:如何解决核心数据崩溃?
下一个:从核心数据传递值
评论