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
}