Core Data中Storm实体两个指向StormPosition的一对多关系无法设置反向关系怎么办
Core Data 双一对多关系指向同一实体的解决方案
无需合并关系也不需要拆分实体,按以下步骤配置即可:
1. 调整数据模型的关系配置
- 在
StormPosition实体中新增两个独立的可选对一关系:- 关系名
historyOwner,目标实体为Storm,反向关系指向Storm的history关系 - 关系名
forecastOwner,目标实体为Storm,反向关系指向Storm的forecast关系
- 关系名
- 回到
Storm实体的关系设置,将history的反向关系指定为historyOwner,forecast的反向关系指定为forecastOwner
2. 赋值逻辑调整
不需要再使用统一的owner属性赋值,按点位类型选择对应的反向关系赋值即可:
- 历史点位赋值:
myStormPosition.historyOwner = self,Core Data会自动将该实例插入到当前Storm的history集合中 - 预报点位赋值:
myStormPosition.forecastOwner = self,Core Data会自动将该实例插入到当前Storm的forecast集合中
3. 可选便捷封装
为了避免调用时赋值错误,可以在Storm的分类/扩展中封装专属的添加方法,Swift示例如下:
extension Storm { func addHistory(_ position: StormPosition) { position.historyOwner = self } func addForecast(_ position: StormPosition) { position.forecastOwner = self } }
注意事项
单个StormPosition实例不要同时对两个owner属性赋值,避免同时出现在两个集合中。该方案完全保留拆分历史、预报集合的使用习惯,无需额外判断时间属性,也不需要做实体类型转换。
内容的提问来源于stack exchange,提问作者Trygve
相关产品推荐
相关产品推荐

