如何对 Cloudkit 记录执行文本搜索?

Posted

技术标签:

【中文标题】如何对 Cloudkit 记录执行文本搜索?【英文标题】:How do I perform text search on Cloudkit records? 【发布时间】:2015-07-16 16:06:16 【问题描述】:

我的 Cloudkit 记录包含“Keywords”字段类型为“text

我可以使用这个模式来获取所有记录的关键字字段

let predicate = NSPredicate(value: true)
let query = CKQuery(recordType: "Library", predicate: predicate)
var operation = CKQueryOperation(query: query)  
operation.desiredKeys = ["KeyWords"]
operation.recordFetchedBlock =  [weak self] (record:CKRecord!) in
  ...

operation.queryCompletionBlock =  [weak self] (cursor:CKQueryCursor!, error:NSError!) in
  ...

self.publicDatabase!.addOperation(operation)

我想将返回的记录限制为关键字字段与搜索字符串匹配的记录,我认为这意味着提供合适的谓词。

documentation 表示 CONTAINS 仅用于列表,除非您使用搜索所有文本字段的 self 关键字

但是,将谓词声明替换为:

let predicate = NSPredicate(format: "SELF CONTAINS[c] %@", searchString)

结果

*** Terminating app due to uncaught exception 'CKException', reason: 'Predicate comparison options are not supported for expression: SELF CONTAINS[c]

并使用

let predicate = NSPredicate(format: "SELF CONTAINS %@", searchString)

结果

*** Terminating app due to uncaught exception 'CKException', reason: 'Unexpected expression: SELF CONTAINS

我确信这很简单,但文档还不完整

【问题讨论】:

【参考方案1】:

您可以使用此谓词进行标记搜索:

NSPredicate(format: "allTokens TOKENMATCHES[cdl] %@", tokens)

更新: 此功能似乎已更改。您现在可以使用:

NSPredicate(format: @"self contains %@", tokens)

或者这个:

NSPredicate(format: @"self contains 'bob' AND self contains ‘smith’”)

更多信息请见:https://developer.apple.com/documentation/cloudkit/ckquery

【讨论】:

这对我不起作用。我收到 CK 错误:'Invalid predicate: userName TOKENMATCHES[cdl] "sc" (Error Domain=CKErrorDomain Code=12 "Invalid operator in <userName TOKENMATCHES[cdl] "sc">: Unsupported operator: TOKENMATCHES Using ios 13, Swift 5, Xcode 11. 这个崩溃原因:'Unable to parse the format string "%@"'...

以上是关于如何对 Cloudkit 记录执行文本搜索?的主要内容,如果未能解决你的问题,请参考以下文章

如何对 CloudKit 记录值求和

如何在 CloudKit 中存储对共享记录的引用

CloudKit,NSPredicate在私有容器中返回计数或确定是否存在任何记录?

搜索并返回 cloudkit 记录的单个字段

如何从 CloudKit 查询和获取数据?

如何在 Swift 中从 CloudKit 中删除资产?