Core Data一对多关系下如何存储有序值 实现健身APP练习有序展示
解决方案
方案1:使用Core Data原生有序关系(推荐)
你勾选有序复选框后报错,核心原因是没有同步更新实体类的代码定义,按以下步骤操作即可:
- 在你的Core Data模型文件(
.xcdatamodeld)中找到Workout实体的consistsOf关系,重新勾选「Ordered」复选框 - 删除之前自动生成的
Workout、Exercise实体的扩展属性代码(通常是Workout+CoreDataProperties.swift这类文件),重新生成实体代码:Xcode顶部菜单栏选择Editor->Create NSManagedObject Subclass,选择对应实体生成新代码 - 赋值时将数组转为
NSOrderedSet类型再给关系属性赋值,示例代码:
// 你要保存的有序练习数组 let targetExercises: [Exercise] = [pushTraining, strengthTraining, aerobicTraining] // 转为Core Data有序关系接受的类型 workout.consistsOf = NSOrderedSet(array: targetExercises)
- 读取时直接获取有序数组即可:
let orderedExercises = workout.consistsOf?.array as? [Exercise] ?? []
方案2:新增排序字段实现(兼容性更好)
如果你不想修改原有关系的配置,或者需要兼容旧版本的数据,用这个方案更稳妥:
- 给
Exercise实体新增一个整数类型的属性sortIndex,设置为非可选,默认值填0 - 往
Workout中添加练习时,按照你想要的展示顺序给每个练习的sortIndex赋值,比如第一个练习赋值0、第二个赋值1,以此类推 - 读取练习列表时,对返回的
NSSet做排序即可得到有序列表,示例代码:
let allExercises = workout.consistsOf?.allObjects as? [Exercise] ?? [] let orderedExercises = allExercises.sorted { $0.sortIndex < $1.sortIndex }
报错原因说明
你之前直接赋值数组、用字典存储都报错,是因为Core Data的一对多关系仅支持两种赋值类型:
- 无序关系:仅接受
NSSet类型 - 有序关系:仅接受
NSOrderedSet类型
其他类型(Array、Dictionary等)都不符合类型要求,会触发类型不匹配的异常。
内容的提问来源于stack exchange,提问作者noloman
相关产品推荐
相关产品推荐

