【问题标题】:How to fetch data using predicate with the ALL ... IN format string如何使用带有 ALL ... IN 格式字符串的谓词获取数据
【发布时间】: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


    【解决方案1】:

    首先请注意,即使它没有崩溃,您的谓词(“%@ 中的所有标签”,标签)也不会完全符合您的要求。只有当它的所有标签都在列表中时,它才会确保交易包含在结果中。但是,如果它只有一个标签,并且只匹配您列表中的一个,它仍然会被包括在内。您需要的是相反的(“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)
    

    【讨论】:

    • 哇,那里开始变得非常混乱 :-D 但这是有道理的。我认为这行得通!我会做额外的案例测试,看看它是否成立。谢谢!
    猜你喜欢
    • 2012-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多