Swift 如何按lastModifiedUserRecordID查询CloudKit?

Swift 如何按lastModifiedUserRecordID查询CloudKit?,swift,cloudkit,Swift,Cloudkit,基于苹果的文档,lastModifiedUserRecordID是一个在iCloud上自动生成的系统字段 我想从我上次修改的公共iCloud数据库中获取记录 我在CloudKit仪表板上将“modifiedBy”设置为可查询,并添加了以下谓词: let userId = CKRecord.Reference(recordID: userCKRecordID, action: .none) lastModifiedPred = NSPredicate(format: "lastModifiedUs

基于苹果的文档,lastModifiedUserRecordID是一个在iCloud上自动生成的系统字段

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

我在CloudKit仪表板上将“modifiedBy”设置为可查询,并添加了以下谓词:

let userId = CKRecord.Reference(recordID: userCKRecordID, action: .none)
lastModifiedPred = NSPredicate(format: "lastModifiedUserRecordID = %@", userId)
它不会返回任何结果。如果删除此谓词,它将返回1个结果,我可以在仪表板中看到上次修改的记录id(recordName)与我发送的用户recordName匹配

奇怪的是,使用“creatorUserRecordID”并传递与上面相同的值确实会返回正确的结果,但我需要lastModifiedBy

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

lastModifiedPred = NSPredicate(format: "lastModifiedUserRecordID = %@", userCKRecord.recordName)
并收到此错误:

“字段”具有引用的值类型,不能为空 使用“筛选值类型字符串”查询


正如我前面提到的,我可以使用顶部的原始谓词(使用CKRecord.ID)查询creatorUserRecordID,但它不适用于lastModifiedUserRecordID。

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

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

基于苹果的文档

CKRecord.ID->class ID:NSObject

记录ID对象由名称字符串和区域ID组成。名称 字符串是长度不超过255个字符的ASCII字符串


比较对象和字符串不会得到结果,请尝试将CKRecord.ID强制转换为字符串可能会有所帮助

因为要获取上次修改的记录,您必须首先获取您的
UserRecordID
。这是通过打电话来完成的

fetchUserRecordID(completionHandler: { (myUserRecordID, error) in
… // see below
}  
看。这样,您就可以获得您的用户
myUserRecordID

使用此选项,您可以设置查询谓词:

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

并执行您的查询。

我不确定这是否有效,用户ID值类似于GUID,因此无法转换为Int。我决定尝试此操作,并收到此错误:“字段”“UUUUUU modifiedBy”“具有引用的值类型,无法使用筛选器值类型字符串查询”此操作有效。我发誓我尝试了这个,但得到了一个错误,我需要一个引用类型(而不是像你现在做的那样给它一个CKRecord.ID),这让我在我的op中走上了这条路,但我只是重新尝试了一下,它成功了。非常感谢。很高兴我能帮忙!