2016-05-30 128 views
0

我已经找出了如何搜索我的CKrecord,并且只用下面的代码显示一个字段的字符串。CKQuery,如何从记录中获取所有字段?

我有几个问题。(我是新来这个)

  1. 我可以搜索,它不区分大小写?

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

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

Dashboard.jpg showing Record and Fields

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) 
    } 
} 

Print Results Output

回答

1

根据苹果的CKQuery Class Reference,你应该能够通过使用标记化搜索记录的字段做两件事:

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

这里是清单5例(SWIFT):

清单5 - 匹配含有一个或多个令牌

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

和A字段清单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在任何领域的任何字匹配的记录。

在夫特2.2:

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

选项2 - 当所有词语addressField.text是在一个领域中的记录(尽管以相同的顺序不是必需的)。

在雨燕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类提供的谓词行为的子集。)

+0

帮助极大。你是如何得到迅捷的例子的?我只能看到Objective C的例子。 – PappaGee

+0

此外,我的搜索变量来自address.Field.text,由用户输入,因此使用您的示例'Bob Smith'。那么我对NSPredicate的语法应该是什么感到困惑(格式:“...... ??? ........”) – PappaGee

+0

我将Objective-C中的例子转换为Swift,因为这是一个快速标记的问题。 (不幸的是,正如您所指出的那样,该参考文档目前只有Objective-C示例。) – breakingobstacles

相关问题