如何通过lastModifiedUserRecordID查询CloudKit?

时间:2019-06-29 07:31:09

标签: swift cloudkit

基于Apple文档,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)

并收到此错误:

  

“字段\'___ modifiedBy \'的值类型为REFERENCE,不能为   使用过滤器值类型“ STRING”查询的

如上所述,我可以使用顶部的原始谓词(使用CKRecord.ID)很好地查询creatorUserRecordID,但不适用于lastModifiedUserRecordID。

3 个答案:

答案 0 :(得分:1)

由于要获取您上次修改的记录,因此必须首先获取UserRecordID。通过调用

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

请参见the docs。这样,您就可以吸引用户myUserRecordID
这样,您可以设置查询谓词:

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

并执行查询。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

基于https://developer.apple.com/documentation/cloudkit/ckrecord/id上的Apple文档

CKRecord.ID->类ID:NSObject

  

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

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