如何用CloudKit JS在自定义Zone中为Record分配引用并保存至该Zone
CloudKit自定义Zone记录保存与引用分配问题解答
1. 怎么把Set记录存到自定义territories Zone里?
你之前在代码里加的zoneID: "territories"其实只是自己定义的一个字段,CloudKit根本不认这个作为记录所属Zone的标识——这就是为啥记录跑到默认Zone里的原因😂。要让记录乖乖进自定义Zone,得按CloudKit的规则来:
正确操作步骤:
- 先创建自定义Zone的Zone ID对象,这是CloudKit识别Zone的关键:
let zoneID = CKRecordZoneID(zoneName: "territories", ownerName: CKCurrentUserDefaultName) - 然后用这个Zone ID来创建你的Set记录,而不是用默认的无Zone参数的初始化方法:
let setRecord = CKRecord(recordType: "Set", zoneID: zoneID) // 给name字段赋值 setRecord["name"] = "AAB" as CKRecordValue // 后面再处理territory引用的设置 - 最后保存的时候,要用到私有数据库实例(自定义Zone都属于私有库),调用保存方法:
let privateDB = CKContainer.default().privateCloudDatabase privateDB.save(setRecord) { record, error in if let err = error { print("保存翻车了: \(err.localizedDescription)") } else { print("完美!记录进自定义Zone了") } }
2. 如何给自定义Zone里的Set记录分配Territory引用?
你之前写的那个包含recordName/action/zoneID的字典,CloudKit是不认识的,得用它原生的CKRecord.Reference类型来做引用。另外还有个关键前提:被引用的Territory记录必须和Set记录在同一个自定义Zone里——默认情况下CloudKit不允许跨Zone的引用,除非你特意配置权限,所以先确保Territory也在territories Zone里。
正确的引用设置方法:
假设你已经拿到了目标Territory记录的ID(注意这个ID必须属于territories Zone):
// 用之前创建的zoneID来构造Territory的记录ID let territoryRecordID = CKRecord.ID(recordName: "4CCA13D2-F52A-47D0-A690-46A556D0CB38", zoneID: zoneID) // 创建引用,设置删除行为为DELETE_SELF(意思是如果Territory被删,对应的Set记录也跟着删) let territoryRef = CKRecord.Reference(recordID: territoryRecordID, action: .deleteSelf) // 把引用赋值给Set记录的territory字段 setRecord["territory"] = territoryRef as CKRecordValue
如果你的Territory记录现在还在默认Zone里,那要么把它移到territories Zone,要么把Set记录改回默认Zone,不然引用会失败哦。
内容的提问来源于stack exchange,提问作者kunass2
相关产品推荐
相关产品推荐

