我很久以前就使用过 coredata。但是,我了解用于存储数据和获取数据的核心数据基础知识。
但是,目前我正在使用 Swift 语言。
我有本地 json 文件,我正在通过解码器解析它并在 tableview 中显示该数据。
let path = Bundle.main.path(forResource: "file", ofType: "json")
do {
let data = try Data(contentsOf: URL(fileURLWithPath: path ?? ""), options: .mappedIfSafe)
let decoder = JSONDecoder()
do {
quData = try decoder.decode(quData.self, from: data)
DispatchQueue.main.async {
self.myTableView.reloadData()
}
} catch {
print("Json decoder error")
}
} catch {
print(LocalizedError.self)
}
为此,我基于 json 的键值创建了模型类。
但是,现在我必须将该数据存储到 Coredata 并取回,需要在同一个 TableView 中显示。
但是,我对应该创建多少键值感到困惑。
我的模型类是:
class QuData: Codable {
let qu: Qu
init(qu: Qu) {
self.qu = qu
}
}
class Qu: Codable {
let music: Music
let dance: dance
init(music: Music, dance: dance) {
self.music = music
self.dance = dance
}
}
class Maths: Codable {
let q1, q2: Q1
init(q1: Q1, q2: Q1) {
self.q1 = q1
self.q2 = q2
}
}
class Q1: Codable {
let query: String
let options: [String]
let answer: String
let q1Optional: Bool
enum CodingKeys: String, CodingKey {
case query, options, answer
case q1Optional = "optional"
}
init(question: String, options: [String], answer: String, q1Optional: Bool) {
self.query = query
self.options = options
self.answer = answer
self.q1Optional = q1Optional
}
}
class Sport: Codable {
let q1: Q1
init(q1: Q1) {
self.q1 = q1
}
}
我的 JSON 数据是
{
"qu": {
"music": {
"q1": {
“query”: “What is your name?”,
"options": [
“Sony”,
“Samsung”,
“Apple”,
“MI”
],
"answer": “Apple”,
"optional": true
}
},
“dance”: {
"q1": {
"question": "5 + 1 = ?",
"options": [
“8”,
“9”,
“6”,
“23”
],
"answer": “23”,
"optional": false
},
"q2": {
"question": "12 - 4 = ?",
"options": [
“5”,
“4”,
“9”,
“6”
],
"answer": "4",
"optional": false
}
}
}
}
如何将这些数据存储到Coredata并获取,显示在tableview中..
并且,json 数据中的两个类别(音乐、舞蹈),我必须在第 1 部分显示“音乐”数据,在第 1 部分显示“舞蹈”数据 节 TableView 。
我完全震惊了,如何在具有属性的实体中创建这种 json 结构并使用相同的模型类(已经为本地 json 文件解析创建)获取它们。
谁能建议我继续前进?
最佳答案
我的建议是使用一个实体。
在 Core Data 中,您可以非常有效地过滤记录,因此添加一个 type
属性来表示 music
、dance
等。您甚至可以添加一个计算属性将 type
属性映射到枚举。 options
属性声明为扁平字符串。使用另一个计算属性将平面字符串映射到数组,反之亦然。
class Question : NSManagedObject {
@NSManaged var type: String
@NSManaged var question: String
@NSManaged var answer: String
@NSManaged var options: String
@NSManaged var optional: Bool
enum QuestionType : String {
case music, dance
}
var questionType : QuestionType {
get { return QuestionType(rawValue: type)! }
set { type = newValue.rawValue }
}
var questionOptions : [String] {
get { return options.components(separatedBy: ", ") }
set { options = newValue.joined(separator: ", ") }
}
或者针对问题针对每种类型和关系使用一个实体
class Music : NSManagedObject {
@NSManaged var questions: Set<Question>
...
}
class Question : NSManagedObject {
@NSManaged var question: String
@NSManaged var answer: String
@NSManaged var options: String
@NSManaged var optional: Bool
@NSManaged var type: Music
...
}
关于ios - 如何在 Swift 中将 Json 模型数据存储和提取到 Coredata,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52484624/