CloudKit 查询与 modifyDate 始终返回无结果
Posted
技术标签:
【中文标题】CloudKit 查询与 modifyDate 始终返回无结果【英文标题】:CloudKit Query with modificationDate Always Returns No Results 【发布时间】:2021-01-15 00:59:47 【问题描述】:我的目标是从我在 CKRecord.ID
s 数组中指定的 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)
...
【讨论】:
这是一个很好的建议,谢谢。我试过了,不幸的是它似乎仍然不起作用。我可以做NSPredicate
s 之一,但不能同时做两者。好奇怪。以上是关于CloudKit 查询与 modifyDate 始终返回无结果的主要内容,如果未能解决你的问题,请参考以下文章
为啥我不能从 Xcode 或 CloudKit Dashboard 查询 CloudKit?
将 NSPredicate/NSCompoundPredicate 与 Where 子句或可选返回一起使用,CloudKit