CloudKit 查询与 modifyDate 始终返回无结果

Posted

技术标签:

【中文标题】CloudKit 查询与 modifyDate 始终返回无结果【英文标题】:CloudKit Query with modificationDate Always Returns No Results 【发布时间】:2021-01-15 00:59:47 【问题描述】:

我的目标是从我在 CKRecord.IDs 数组中指定的 CloudKit 中获取 User 记录,但前提是它们的更新时间比我在本地跟踪的上次更新日期更晚。

我正在执行以下 CloudKit 查询:

var predicate:NSPredicate

if let lastChecked = defaults.object(forKey: "lastUserFetch") as? Date
  //Subsequent fetches
  predicate = NSPredicate(format: "modificationDate > %@ AND recordID IN %@", argumentArray: [lastChecked, userRecordIDs])

else
  //First fetch
  predicate = NSPredicate(format: "recordID IN %@", argumentArray: [userRecordIDs])


let query = CKQuery(recordType: "User", predicate: predicate)
let operation = CKQueryOperation(query: query)
...

当我的应用程序启动时,我最初将lastUserFetch 设置为nil,并且查询的“First fetch”部分成功。我找回了所有的用户记录。

但是一旦我在查询完成后设置了我的lastUserFetch 日期:

defaults.set(Date(), forKey: "lastUserFetch")

当包含modificationDate > %@ 部分时,我得到0 记录返回。当然,我修改了 CloudKit Dashboard 中的记录,我可以看到他们的 modificationDate 已经更新并且比我的 lastUserFetch 日期更新,但他们仍然没有在我的搜索结果中返回。

如何将modificationDate 比较与recordID IN 查询结合起来?

【问题讨论】:

呃……因为如此可靠,CloudKit 肯定是不可靠的。 ???我在另一种记录类型上尝试了这个查询并且它有效。所以我通过在 CloudKit 仪表板中删除它并重建它来重建我的 User 记录类型,现在它又可以工作了。嘘。 【参考方案1】:

使用NSCompoundPredicate:

var predicate:NSPredicate

//Every fetch
predicate = NSPredicate(format: "recordID IN %@", argumentArray: [userRecordIDs])

if let lastChecked = defaults.object(forKey: "lastUserFetch") as? Date
  //Subsequent fetches
  predicate = NSCompoundPredicate(andPredicateWithSubpredicates: [predicate,  NSPredicate(format: "modificationDate > %@", argumentArray: [lastChecked]))

let query = CKQuery(recordType: "User", predicate: predicate)
let operation = CKQueryOperation(query: query)
...

【讨论】:

这是一个很好的建议,谢谢。我试过了,不幸的是它似乎仍然不起作用。我可以做NSPredicates 之一,但不能同时做两者。好奇怪。

以上是关于CloudKit 查询与 modifyDate 始终返回无结果的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能从 Xcode 或 CloudKit Dashboard 查询 CloudKit?

将 NSPredicate/NSCompoundPredicate 与 Where 子句或可选返回一起使用,CloudKit

CloudKit 数据库查询问题

查询 CloudKit 用户记录给出“无法查询系统类型”

CloudKit 查询中的 UITableView 部分

CloudKit 查询的奇怪错误