使用“CONTAINS”运算符时,带有 NSPredicate 的 CKQuery 失败

Posted

技术标签:

【中文标题】使用“CONTAINS”运算符时,带有 NSPredicate 的 CKQuery 失败【英文标题】:CKQuery with NSPredicate fails when using "CONTAINS" operator 【发布时间】:2016-02-12 18:36:03 【问题描述】:

根据 Apples Class Reference CKQuery,运算符 CONTAINS 是受支持的运算符之一。但是,这似乎不起作用。我有一个名为myRecordRecordType,以及一个字段名称为name 的记录类型为String。我尝试使用两种不同的谓词获取记录,一种使用“==”运算符,一种使用CONTAINS 运算符。

func getRecords() 
    let name = "John"
    let Predicate1 = NSPredicate(format: "name == %@",name)
    let Predicate2 = NSPredicate(format: "name CONTAINS %@",name)

    let sort = NSSortDescriptor(key: "Date", ascending: false)
    let query = CKQuery(recordType: "myRecord", predicate: Predicate1)
    // let query = CKQuery(recordType: "myRecord", predicate: Predicate2)
    query.sortDescriptors = [sort]

    let operation = CKQueryOperation(query: query)
    operation.desiredKeys = ["name", "Date"]

    operation.recordFetchedBlock =  (record) in
        print(record["name"])

        operation.queryCompletionBlock =  [unowned self] (cursor, error) in
            dispatch_async(dispatch_get_main_queue()) 
                if error == nil 

                    print ("sucess")
                 else 
                    print("couldn't fetch record error:\(error?.localizedDescription)")

                
            

        

        CKContainer.defaultContainer().publicCloudDatabase.addOperation(operation)
    

使用Predicate1,输出为:

Optional(John)
sucess

使用Predicate2,输出为:

couldn't fetch record error:Optional("Field \'name\' has a value type of STRING and cannot be queried using filter type LIST_CONTAINS")

同时使用[c] 忽略大小写会导致服务器问题。

如何正确使用运算符CONTAINS

编辑: 我现在仔细查看了文档,发现CONTAINS 只能与SELF 一起使用。这意味着所有字符串字段都将用于搜索。没有更好的办法吗?

【问题讨论】:

【参考方案1】:

这是一个例外,如下所述:

除了一个例外,CONTAINS 运算符只能用于测试 列出成员资格。例外是当您使用它来执行全文 结合自键路径进行搜索。自键路径 导致服务器在可搜索的基于字符串的字段中查找 指定的令牌字符串。例如,@"self 的谓词字符串 contains 'blue'" 在所有标记为的字段中搜索单词“blue” 包含在全文搜索中。您不能使用自键路径 在类型不是字符串的字段中搜索。

因此,您可以使用 'self' 而不是 '%K' 来搜索字符串字段的子文本。

For the full document written by Apple

【讨论】:

有没有人有“自我包含任何东西”来实际工作?我在 cloudkit 中有可搜索的字段,结果总是空的。最令人沮丧的是 SQL 中的一些微不足道的事情。 我已经向苹果提出了支持请求。他们已经确认这是一个错误。我不太相信它会被修复,因为我提出的所有错误报告都已作为重复文件关闭并且从未修复。一旦我举起雷达,就会用雷达报告。 出现错误,FB7352939

以上是关于使用“CONTAINS”运算符时,带有 NSPredicate 的 CKQuery 失败的主要内容,如果未能解决你的问题,请参考以下文章

Oracle db 中的包含运算符不显示带有 *&?^$# 字符的单词

使用 '==' 比较器和使用带有 spark 的 .contains('val') 有啥区别?

在 Cloudkit 谓词上使用 OR 运算符

本地序列不能在查询运算符的 LINQ to SQL 实现中使用,但 Contains() 运算符除外

在带有整数数组的 ArrayList 上使用 contains

如何在这里使用 XPath contains()?