如何通过lastModifiedUserRecordID查询CloudKit?

How to query CloudKit by lastModifiedUserRecordID?

根据 Apple 文档,lastModifiedUserRecordID 是在 iCloud 上自动生成的系统字段。

我想从我上次修改的 public iCloud 数据库中获取记录。

我在 CloudKit 仪表板上将 "modifiedBy" 设置为可查询并添加了这个谓词:

let userId = CKRecord.Reference(recordID: userCKRecordID, action: .none)
lastModifiedPred = NSPredicate(format: "lastModifiedUserRecordID = %@", userId)

而且 return 没有结果。如果我删除这个谓词,它 returns 1 结果,我可以在仪表板中看到最后修改的记录 ID (recordName) 与我发送它的用户 recordName 匹配。

奇怪的是,使用 "creatorUserRecordID" 并传递与上面相同的值确实 return 正确的结果,但我需要 lastModifiedBy。

编辑:根据建议,我尝试使用实际的 userCKRecord.recordName 作为字符串并将此谓词发送到 CloudKit。

lastModifiedPred = NSPredicate(format: "lastModifiedUserRecordID = %@", userCKRecord.recordName)

并收到此错误:

"Field \'___modifiedBy\' has a value type of REFERENCE and cannot be queried using filter value type STRING"

正如我上面提到的,我可以使用顶部的原始谓词(使用 CKRecord.ID)很好地查询 creatorUserRecordID,但它对 lastModifiedUserRecordID 不起作用。

您正在使用 NSPredicate 来比较字符串文字。其中 userId 不是字符串文字。使用这个。

lastModifiedPred = NSPredicate(format: "lastModifiedUserRecordID = %d", INT-VALUE-OF-userId)

基于 https://developer.apple.com/documentation/cloudkit/ckrecord/id

上的苹果文档

CKRecord.ID -> class ID:NSObject

A record ID object consists of a name string and a zone ID. The name string is an ASCII string not exceeding 255 characters in length.

比较对象和字符串不会给你结果,尝试将 CKRecord.ID 转换为字符串可能会有帮助

由于您想获取您最后修改的记录,因此您必须先获取您的 UserRecordID。这是通过调用

fetchUserRecordID(completionHandler: { (myUserRecordID, error) in
… // see below
}  

参见 the docs。这样,您就可以得到您的用户 myUserRecordID.
有了这个,您可以设置查询谓词:

let lastModifiedPred = NSPredicate(format: "lastModifiedUserRecordID = %@", myUserRecordID)  

并执行您的查询。