Как выполнить частичное обновление в Realm с использованием объекта `Decodable` без потери данных? - PullRequest
0 голосов
/ 30 августа 2018

У меня есть JSON-API, который возвращает мне массивы Courses. У Courses есть CourseLocations, CourseTypes и т. Д. Все они имеют первичные ключи. Я подумал, что было бы здорово разобрать все с помощью Codable и обновить его с помощью Realm().add(_:update:).

Все отлично работает. Проблема возникает, когда API не возвращает полный объект.

Скажем так. API "/ types" возвращает мне массив ниже, и он имеет все необходимые данные для создания или обновления объекта.

[
   { "id": "1", "name": "Type 1", "sessions": 10, "sessionTime": 120.0 },
   { "id": "2", "name": "Type 2", "sessions": 5, "sessionTime": 20.0 }
]

Но затем я вызываю другой метод API "/ courses", который возвращает мне информацию о курсе плюс объект "типы", но не все, только его id и name:

[
   {
     "id": "0013",
     "name": "Super cool course",
     "type": { "id": "2", "name": "Type 2" }
    }
]

Итак, когда я делаю «add (_: update :)» для курса, я фактически обновляю все значения моего CourseType объекта, а не только имя. В результате мои свойства sessions и sessionTime установлены в 0.

Как мне этого избежать?

Вот класс для справки.

class CourseType: Object, Decodable {
    @objc dynamic var identifier = UUID().uuidString
    @objc dynamic var name = ""
    @objc dynamic var sessions = 0
    @objc dynamic var sessionTime = 0.0

    private enum CodingKeys: String, CodingKey {
        case identifier = "id"
        case name
        case sessions
        case sessionTime = "session_time"
    }

    override static func primaryKey() -> String {
        return "identifier"
    }
}
...