ios - 如何在 Swift 中将 Json 模型数据存储和提取到 Coredata

标签 ios json swift core-data structure

我很久以前就使用过 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 属性来表示 musicdance 等。您甚至可以添加一个计算属性将 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/

相关文章:

IOS:从其他选项卡中展开segues

ios - 如果键盘在 ios 应用程序中可见,如何以编程方式快速检查

swift - 无法使用 RealityKit 场景预览 SwiftUI Canvas

iphone - VFR 阅读器在 IOS 7 中崩溃

ios - 将新对象添加到 Realm 中的现有列表

c# - 使用C# HttpWebRequest 发送json数据到web服务

javascript - 获取 JSON 标签内的所有 JSON 实例 (JAVASCRIPT)

java - 使用具有复杂多态结构的 Jackson 反序列化 JSON

ios - 导航栏和主屏幕上的 UIImageView

ios - SwiftUI 和数据模型 (CoreData) - 如何更改数据?