如何通过lastModifiedUserRecordID查询CloudKit?查询无结果求助
解决CloudKit查询lastModifiedUserRecordID无结果的问题
我之前也踩过CloudKit这个查询的坑,结合你的描述,给你几个针对性的解决思路:
1. 确认CloudKit控制台的字段配置
首先再仔细检查一遍CloudKit控制台的设置:
- 你要确保是在系统字段里开启了
___modifiedBy(注意是三个下划线开头)的可查询权限,而不是自己创建的自定义字段。有时候控制台的设置可能需要等几分钟同步到服务器,建议修改后稍等再测试。
2. 用正确的类型构造查询谓词
这是核心问题!你之前的两种写法都不对:
- 用
CKRecord.Reference:系统字段lastModifiedUserRecordID存储的是CKRecord.ID类型,不是Reference,所以用Reference匹配会失败; - 用字符串:CloudKit明确提示这个字段是REFERENCE类型(这里其实指的是内部存储的记录ID引用),不能用字符串直接匹配。
正确的写法应该直接传入CKRecord.ID对象:
let lastModifiedPred = NSPredicate(format: "lastModifiedUserRecordID = %@", userCKRecordID)
这里的userCKRecordID就是你拿到的当前用户的CKRecord.ID实例,不需要包装成Reference。
3. 为什么creatorUserRecordID能用Reference?
其实creatorUserRecordID的标准查询方式也应该用CKRecord.ID,只是CloudKit对creator字段做了兼容处理,允许用Reference进行匹配,但lastModifiedUserRecordID没有这个兼容,所以必须严格使用CKRecord.ID来构造谓词。
4. 验证小技巧
可以先执行不带谓词的查询,拿到那条目标记录后,打印它的lastModifiedUserRecordID,然后和你传入的userCKRecordID做对比:
if let record = fetchedRecords.first { print("Record's lastModifiedUserID: \(record.lastModifiedUserRecordID?.recordName ?? "nil")") print("Your userID: \(userCKRecordID.recordName)") print("Are they equal? \(record.lastModifiedUserRecordID == userCKRecordID)") }
这样可以确认两个ID是否真的完全一致,避免因为大小写、拼写错误导致的匹配失败。
内容的提问来源于stack exchange,提问作者William T.
相关产品推荐
相关产品推荐

