CloudKit + Core Data 实体关联关系无法跨设备同步问题求助
解决方案
1. 校验双向关联配置
Core Data 配合 CloudKit 同步关联关系的前提是必须配置双向绑定的Inverse属性,单向关联无法被同步到 CloudKit:
- 打开你的
.xcdatamodeld数据模型文件,选中Credit Card实体的transactions关联,在右侧数据模型检查器的Inverse下拉框,选择Transaction实体的creditcard关联 - 再选中
Transaction实体的creditcard关联,确认Inverse已自动指向Credit Card的transactions关联
2. 确认实体所属配置
检查Credit Card和Transaction两个实体的Configuration属性,必须都设置为你开启了「Used with CloudKit」的Default配置,任意实体落在未开启 CloudKit 同步的配置下都会导致关联同步失败。
3. 修正查询代码的关联加载逻辑
第二台设备查询时返回0,大概率是关联属性还处于fault状态未被实际加载,你可以通过两种方式解决:
- 点击时先强制触发关联加载再计数:
.onTapGesture { let transactions = creditcard.transactions?.allObjects as? [CCTransaction] ?? [] print(transactions.count) }
- 在
FetchRequest中添加关联预取配置,避免fault问题:
@FetchRequest( sortDescriptors: [NSSortDescriptor(keyPath: \CreditCard.name, ascending: true)], relationshipKeyPathsForPrefetching: ["transactions"], // 新增预取关联字段 animation: .default) var creditcards: FetchedResults<CreditCard>
注:你创建数据时同时设置了双向关联,实际只需设置任意一个,Core Data会自动维护反向关联,重复设置不会出错但无必要。
4. 校验CloudKit Schema同步状态
如果上述操作仍未解决,登录苹果CloudKit Dashboard进入对应Container,选择当前使用的环境(开发/生产):
- 查看
Credit Card类型的记录,确认存在你创建的「First Card」记录 - 查看
Transaction类型的记录,确认存在对应的交易记录,且其creditcard字段的Reference类型值指向对应的Credit Card记录
如果Reference字段不存在,说明Xcode未自动同步模型变更到CloudKit,你可以删除开发环境的所有Schema,重启Xcode后重新运行App触发自动同步即可。
内容的提问来源于stack exchange,提问作者Chat Dp
相关产品推荐
相关产品推荐

