首页 > 解决方案 > 如何在核心数据中存储自定义对象数组?

问题描述

核心数据对我来说还是有点新鲜,所以我不太了解其中的来龙去脉。我了解如何在核心数据中保存字符串、整数等基础知识,但我不太了解如何将自定义对象数组保存到核心数据中,或者是否可能。根据我的研究,我目前的理解是我需要将属性设置为二进制数据,并将其标识符设置为 [exercise](制作健身应用程序)。不幸的是,当我尝试将数组传递到托管上下文时,我的代码中出现错误,显示为“无法将类型 '[Exercise]' 的值分配给类型'数据?'”

func save (completion: (_ finished: Bool) -> ()){
    guard let managedContext = appDelegate?.persistentContainer.viewContext else { return }
    let workout = Workout(context: managedContext)

    workout.nameOfWorkout = workoutNameField.text
    workout.exercises = exercises // error appears on this line, both "exercises" are arrays


}

我想我的问题是,我正在尝试做的事情是否可能?如果是这样,我错过了哪些步骤?我在某处读到将数组转换为 NSData,并在需要访问时将其改回,但我担心的是,当我尝试将其改回时,它不会按计划工作。很抱歉这个冗长的问题,只是想确保我包含了我能想到的所有细节。

标签: arraysswiftcore-data

解决方案


对于在 CoreData 中存储自定义类型,最快的方法是:

  1. 使您的自定义类型 ( Exercise) 的子类NSObject
  2. 将核心数据模型中的属性类型设置为Transformable
  3. 设置CustomClass[Exercise]

所以你必须定义你的Exercise类,类似于:

public class Exercise: NSObject {
  let name: String
  let duration: TimeInterval

  init(name: String, duration: TimeInterval) {
    self.name = name
    self.duration = duration
  }
}

然后你去模型定义并设置属性类型和CustomClass字段:

CoreData 模型示例

您现在可以将保存功能用作:

func save (completion: (_ finished: Bool) -> ()){
  guard let managedContext = appDelegate?.persistentContainer.viewContext else { return }
  let workout = Workout(context: managedContext)

  workout.nameOfWorkout = workoutNameField.text
  workout.exercises = exercises

}

推荐阅读