我已经找到了如何搜索我的CKrecord,并且只在下面的代码中显示一个字段中的字符串。
我有几个问题.(我是新手)
我正在制作一个参考应用程序,所以您可以搜索,例如,BBC1,以及所有与BBC1 (即在recordID中)显示相关的东西。
Dashboard.jpg显示记录和字段
import UIKit
import CloudKit
import MobileCoreServices
class ViewController: UIViewController {
@IBOutlet var addressField: UITextField!
@IBOutlet var commentsField: UITextView!
let container = CKContainer.defaultContainer()
var publicDatabase: CKDatabase?
var currentRecord: CKRecord?
override func viewDidLoad() {
publicDatabase = container.publicCloudDatabase
super.viewDidLoad()
}
@IBAction func performQuery(sender: AnyObject) {
let predicate = NSPredicate(format: "serviceName = %@", addressField.text!)
let query = CKQuery(recordType: "SystemFields", predicate: predicate)
publicDatabase?.performQuery(query, inZoneWithID: nil, completionHandler: ({results, error in
if(error != nil) {
dispatch_async(dispatch_get_main_queue()) {
self.notifyUser("Cloud Access Error",
message: error!.localizedDescription)
}
} else {
if results!.count > 0 {
let record = results![0]
self.currentRecord = record
dispatch_async(dispatch_get_main_queue()) {
self.commentsField.text = record.objectForKey("Location") as! String
}
} else { dispatch_async(dispatch_get_main_queue()) {
self.notifyUser("No Match Found",
message: "No record matching the address was found")
}
}
}
}))
}
func notifyUser(title: String, message: String) -> Void
{
let alert = UIAlertController(title: title,
message: message,
preferredStyle: UIAlertControllerStyle.Alert)
let cancelAction = UIAlertAction(title: "OK",
style: .Cancel, handler: nil)
alert.addAction(cancelAction)
self.presentViewController(alert, animated: true,
completion: nil)
}
}打印结果输出
发布于 2016-06-01 01:53:35
根据苹果的CKQuery类引用,您应该可以通过对记录的字段进行标记化搜索来做到这两种方法:
若要对记录的字段执行标记化搜索,请使用特殊运算符
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'")
最后,查看有关索引和全文搜索的信息,因为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类提供的谓词行为的子集。)
https://stackoverflow.com/questions/37534724
复制相似问题