Ios 如何将字典保存到Swift中的核心数据

Ios 如何将字典保存到Swift中的核心数据,ios,swift,Ios,Swift,使用核心数据保存词典的最佳方法是什么?我有一本定义为 var myRecipes:[String:[Recipe]] 其中,Recipe是包含有关配方的运行状况信息的结构。字符串将是一个类似“早餐”或“午餐”的类别,并且配方数组将包含早餐或午餐配方 在核心数据中添加新类别和向类别添加配方的最佳方式是什么 您可以将字典序列化为数据,并将其保存到核心数据以供以后使用。以下是例子: struct Recipe: Codable { let identify: String let n

使用核心数据保存词典的最佳方法是什么?我有一本定义为

var myRecipes:[String:[Recipe]]
其中,Recipe是包含有关配方的运行状况信息的结构。字符串将是一个类似“早餐”或“午餐”的类别,并且配方数组将包含早餐或午餐配方


在核心数据中添加新类别和向类别添加配方的最佳方式是什么

您可以将字典序列化为数据,并将其保存到核心数据以供以后使用。以下是例子:

struct Recipe: Codable {
    let identify: String
    let name: String
}

let myRecipes:[String:[Recipe]] = ["key_1": [Recipe(identify: "r_1", name: "r_name_1")],
                                   "key_2": [Recipe(identify: "r_2", name: "r_name_2"),
                                             Recipe(identify: "r_3", name: "r_name_3")]]
let jsonData = try! JSONEncoder().encode(myRecipes) // Save this value (type: Data) to core data.
// later when you want to construct your Dictionary back, use following code:
let result = try! JSONDecoder().decode([String: [Recipe]].self, from: jsonData) // `jsonData` here is retrieved from core data.
但是,为什么不为它们创建两个单独的实体(
类别
配方
)?我想这会让事情更清楚

快乐编码

  • 在核心数据中创建两个实体
    类别
    配方
  • Category
    中声明一个属性
    name
    和一个到多个非可选关系
    recipes
    Recipe
  • Recipe
    中,声明所需的属性和一个可选的关系
    category
    category

我建议手动创建
NSManagedObject
子类(Codegen手动/None和菜单编辑器>创建NSManagedObject子类…)。然后您可以将对多关系声明为本机
Set
而不是无类型
NSSet

您不能直接将字典或数组存储到核心数据。您可以创建类或结构来实现相同的功能,然后添加所需的属性。下面我给你举个例子。您需要使用可转换的类型在实体中创建一个属性

//如何节约

        let entityDescription = NSEntityDescription.entity(forEntityName: "Task", in: taskManagedContext) // use your managedcontext
        let data = Task(entity: entityDescription!, insertInto: taskManagedContext)// managedcontext
        data.task_object = NSKeyedArchiver.archivedData(withRootObject: taskDetails) as NSObject
do {
            try youManagedContext.save() // user your managedcontext
            return true
        } catch {
               print(error.localizedDescription)
        }
如何获取数据。您需要取消对象的归档

 // logic of fetc logic which will return array of type Task object i.e [Task]
    for i in (0..<tasksFromDatabase!.count) {
          var innerArray = [FleetInfoDetails]()
           let taskData = NSData(data: tasksFromDatabase?[i].value(forKey: "task_object") as! Data) as Data
            let taskDetails = NSKeyedUnarchiver.unarchiveObject(with: taskData) as! FleetInfoDetails
        }
//fetc逻辑的逻辑,该逻辑将返回Task对象类型的数组,即[Task]

对于(0.)中的i,这是一种广义的方法,到目前为止,您是否有数据模型和一些用于处理实体的代码?
 // logic of fetc logic which will return array of type Task object i.e [Task]
    for i in (0..<tasksFromDatabase!.count) {
          var innerArray = [FleetInfoDetails]()
           let taskData = NSData(data: tasksFromDatabase?[i].value(forKey: "task_object") as! Data) as Data
            let taskDetails = NSKeyedUnarchiver.unarchiveObject(with: taskData) as! FleetInfoDetails
        }