我有以下谓词:
let predicate = NSPredicate(format: "NOT (recordID in %@)", recordIDs)
-- recordIDs is an array of CKRecordID objects corresponding to the CKRecords on the device
...产生关于谓词的运行时错误。如果我将谓词格式字符串更改为其他内容,则查询运行正常。我有"查询"复选框在CloudKit中检查此记录类型的所有元数据。
谓词中使用的键名对应于当前评估记录中的字段。键名可以包括记录的元数据属性的名称,例如" creationDate“或您添加到记录中的任何数据字段。
根据CKRecord documentation,这些是用于查询的可用元数据:
recordID,recordType,creationDate,creatorUserRecordID,modificationDate,lastModifiedUserRecordID,recordChangeTag
答案 0 :(得分:1)
您可以使用创建日期:
NSPredicate(format: "creationDate > %@", dateLastFetched)
将记录下拉到设备并保存后,保存dateLastFetched并将其用于后续提取。
编辑:确保在CloudKit仪表板上启用creationDate查询索引(默认情况下不像许多其他索引那样启用)
答案 1 :(得分:0)
答案 2 :(得分:0)
这是一个古老的问题,所以我不确定它是否当时存在,但是现在正确的方法是使用Apple内置的服务器更改令牌支持。 / p>
对包含设备上所有现有记录ID的大型查询进行查询将很慢,并且选择日期也不精确。
正确的方法是使用CKFetchRecordZoneChangesOperation
并使用操作的CKServerChangeToken
属性传递configurationsByRecordZoneID
。
第一次调用时,传递一个nil
更改令牌。收到记录后,CloudKit将使用最新的更改令牌调用recordZoneChangeTokensUpdatedBlock
。坚持使用最新的令牌,以便下次您需要从服务器记录时,只需传递最新的令牌即可,然后仅获取自那时以来发生的更改。