如何使用“Decodable”对象在 Realm 中进行部分更新而不丢失数据?

Jar*_*rod 5 realm swift decodable

我有一个 JSON-API,它返回Courses. 它们Courses都有主键CourseLocations。我认为使用 解析所有内容并使用 更新它CourseTypes会很棒。CodableRealm().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 }
]
Run Code Online (Sandbox Code Playgroud)

但随后我调用另一个 API 方法“/courses”,它返回一个课程信息以及对象“类型”,但不是全部,只是它的idname

[
   {
     "id": "0013",
     "name": "Super cool course",
     "type": { "id": "2", "name": "Type 2" }
    }
]
Run Code Online (Sandbox Code Playgroud)

因此,当我为课程执行“add(_:update:)”时,我实际上更新了对象的所有值CourseType,而不仅仅是名称。结果,mysessionssessionTimeproperty 被设置为 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"
    }
}
Run Code Online (Sandbox Code Playgroud)