我已经找到了如何搜索我的CKrecord并仅使用下面的代码显示一个字段中的字符串。
我有几个问题..(我是新手)
我可以搜索并且不区分大小写吗?
如何搜索记录中的所有字段,然后在匹配项上显示所有字段?
我正在制作一个参考应用程序,因此您可以搜索BBC1以及与BBC1相关的所有内容(即在该recordID中)。
Dashboard.jpg showing Record and Fields
{{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类提供的谓词行为的子集。)