如何通过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)
并执行您的查询。
根据 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)
并执行您的查询。