CKQuery,如何从Record中获取所有Field?

时间:2016-05-30 23:21:18

标签: ios swift cloudkit

我已经找到了如何搜索我的CKrecord并仅使用下面的代码显示一个字段中的字符串。

我有几个问题..(我是新手)

  1. 我可以搜索并且不区分大小写吗?

  2. 如何搜索记录中的所有字段,然后在匹配项上显示所有字段?

  3. 我正在制作一个参考应用程序,因此您可以搜索BBC1以及与BBC1相关的所有内容(即在该recordID中)。

    Dashboard.jpg showing Record and Fields

    {{1}}

    Print Results Output

1 个答案:

答案 0 :(得分:1)

根据Apple的 CKQuery Class Reference ,你应该可以通过使用记录字段的标记化搜索来做到这两点:

  

要对记录的字段执行标记化搜索,请使用特殊运算符self。标记化搜索会搜索启用了全文搜索的任何字段,默认情况下这是所有基于字符串的字段。标记化字符串中的每个不同单词都被视为单独的标记,以便进行搜索。比较是不区分大小写和不区分大小写的。这些令牌字符串可以在单个字段或多个字段中找到。

这是清单5的例子(在Swift中):

  

清单5 - 匹配包含一个或多个令牌的字段

     

var predicate = NSPredicate(format: "self contains 'bob smith'")

清单6示例(在Swift中):

  

清单6 - 匹配包含多个标记的字段

     

var predicate = NSPredicate(format: "self contains 'bob' AND self contains 'smith'")

最后,请查看 Indexes and Full-Text Search 上的信息,因为您在CloudKit中的记录配置会影响搜索的字段(和效果)。

编辑:进一步澄清您的用例:

由于您正在使用addressField.text的内容来执行搜索...

您必须决定是否要匹配:

选项1 - 当addressField.text中的任何单个单词与记录中任何字段中的任何单词匹配时。

在Swift 2.2中:

let predicate = NSPredicate(format: "self contains %@", addressField.text!)

选项2 - 当 addressField.text中的所有单词都在记录中的某个字段中时(尽管不一定按照相同的顺序)。

在Swift 2.2中:

// creates a compound predicate to match all words in a string
// returns: nil if input was empty, otherwise an NSPredicate
func createPredicateForMatchingAllWordsIn(string: String) -> NSPredicate?
{
    guard !string.isEmpty else { return nil }
    var predicateList : [NSPredicate] = []

    let words = string.componentsSeparatedByString(" ")
    for word in words {
        if !word.isEmpty {
            predicateList.append(NSPredicate(format: "self contains %@", word))
        }
    }

    return NSCompoundPredicate(andPredicateWithSubpredicates: predicateList)
}

let predicate = createPredicateForMatchingAllWordsIn(addressField.text!)

如果您想进行其他过滤,例如只显示匹配按顺序的字词的记录,则可以在客户端进行此操作。 (CKQuery类仅支持完整NSPredicate类提供的谓词行为的子集。)