Как сохранить и извлечь данные модели Json для Coredata в Swift - PullRequest
0 голосов
/ 24 сентября 2018

Я использовал coredata давно назад.Но я знаю основы coredata для хранения и извлечения данных.

Но, в настоящее время я работаю с языком Swift.

У меня есть локальный файл json, и я делаю его анализ с помощью декодера и отображенияэти данные в табличном виде.

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 и Fetch обратно,Необходимо показать в том же табличном виде.

Но у меня возникает путаница, сколько ключевых значений мне нужно создать.

Мой класс модели:

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 и получить их, показывая в виде таблицы ..

И, две категории (музыка, танцы) в данных json, у меня естьпоказывать данные «Музыка» в 1-м разделе и данные «Танец» в виде таблицы.

Я полностью поражен тем, как создать такую ​​структуру json в Entity с атрибутами и извлекать их, используя тот же класс модели (который ужесоздан для местного JSONразбор файлов).

Может кто-нибудь предложить мне двигаться дальше?

1 Ответ

0 голосов
/ 25 сентября 2018

Я предлагаю использовать один объект.

В Базовых данных вы можете очень эффективно фильтровать записи, поэтому добавьте атрибут 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

    ...
}
...