首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >CKQuery,如何从记录中提取所有字段?

CKQuery,如何从记录中提取所有字段?
EN

Stack Overflow用户
提问于 2016-05-30 23:21:18
回答 1查看 807关注 0票数 0

我已经找到了如何搜索我的CKrecord,并且只在下面的代码中显示一个字段中的字符串。

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

  1. 我可以搜索并且不区分大小写吗?
  2. 如何搜索记录中的所有字段,然后在匹配中显示所有字段?

我正在制作一个参考应用程序,所以您可以搜索,例如,BBC1,以及所有与BBC1 (即在recordID中)显示相关的东西。

Dashboard.jpg显示记录和字段

代码语言:javascript
运行
复制
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)
    }
}

打印结果输出

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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:

代码语言:javascript
运行
复制
let predicate = NSPredicate(format: "self contains %@", addressField.text!)

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

在Swift 2.2:

代码语言:javascript
运行
复制
// 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类提供的谓词行为的子集。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37534724

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档