使用 NSPredicate 和数组进行 cloudKit 搜索

Posted

技术标签:

【中文标题】使用 NSPredicate 和数组进行 cloudKit 搜索【英文标题】:Using NSPredicate with array for cloudKit search 【发布时间】:2016-02-05 10:11:43 【问题描述】:

当使用NSPredicate 时,我正在尝试搜索包含在数组中的所有对象(字符串)。下面的代码示例有效,但谓词仅收集第一个索引中的对象?? NSPredicate 用于CKQueryOperation。 每个Record 都有一个名为Category 的键的值。

    let array: [String] = ["Education", "Sport", "TV and Film"]

    // select all records
    //let predicate = NSPredicate(format: "Category = %@", category )



    let predicate = NSPredicate (format: "Category == %@", argumentArray: array)

    let query = CKQuery(recordType: "quizRecord", predicate: predicate)

    // get just one value only
    let operation = CKQueryOperation(query: query)

  //code works but only queries Records with the Category for "Education" 

【问题讨论】:

***.com/questions/18059170/… ? @Larme 那个问题/答案在 ObjectiveC 中——我尝试了很多变体,但我可以把它翻译成 Swift。 如何获得多个值? 【参考方案1】:

尝试替换:

"Category == %@"

与:

"Category IN %@"

【讨论】:

谢谢,但您的回答出现以下错误:'CKException',原因:'无效谓词:Category IN "Education" (Error Domain=CKErrorDomain Code=12 "Invalid operator in :不支持的运算符:IN" UserInfo=ck_isComparisonError=true, 我知道这里发生了什么。将谓词行从:let predicate = NSPredicate (format: "Category == %@", argumentArray: array) 更改为 let predicate = NSPredicate (format: "Category == %@", argumentArray: [array])。请注意,该数组应放在argumentArray 参数数组中。这应该与上述谓词中的IN 更改一起完成。 是的,就是这样!出色的工作。谢谢丹尼,非常感谢您的帮助 我遇到了同样的问题,只有搜索数组的第一个元素被匹配。我尝试了 Danny 的解决方案,但返回一个错误:“过滤器 EQUALS 不能与过滤器值类型 STRING_LIST 一起应用”。使用 Xcode 8.3.2 和 Swift 3。现在做什么?【参考方案2】:

我遇到了和 Peter Wiley 一样的问题。我找到的解决方案是 Danny Bravo 的解决方案的混搭,并对该解决方案发表评论。

let arrayPredicate = NSPredicate(format: "Name IN %@", argumentArray: [names])

为了获得多个结果,我需要在格式中同时使用关键字“IN”并用 [] 包装我的 argumentArray。

【讨论】:

以上是关于使用 NSPredicate 和数组进行 cloudKit 搜索的主要内容,如果未能解决你的问题,请参考以下文章

使用 NSPredicate 对 NSArray 进行排序,然后存储在一个新数组中

如何对 NSPredicate 进行排序

使用 NSPredicate 过滤数组

使用 Realm 和 NSPredicate 按数组索引排序

NSPredicate 用于过滤数组

如何使用 NSPredicate 加快数组搜索速度?