使用 NSPredicate 的 CKQuery 在使用运算符时失败"CONTAINS"



根据Apple的类参考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一起使用。这意味着所有字符串字段都将用于搜索。难道没有更好的方法吗?

这是一个

例外,如下所示:

除了一个例外,CONTAINS 运算符只能用于测试 列出成员身份。例外情况是当您使用它来执行全文时 与自密钥路径一起搜索。自密钥路径 使服务器在可搜索的基于字符串的字段中查找 指定的令牌字符串。例如,@"self 的谓词字符串 包含"蓝色"在所有标记为 包含在全文搜索中。您不能使用自密钥路径 在类型不是字符串的字段中搜索。

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

对于苹果撰写的完整文档

最新更新