RealmSwift LinkingObjects 和 Decodable

RealmSwift LinkingObjects and Decodable

我有一个 Realm 模型 class,我需要它是可解码的,这样我就可以从 JSON 序列化它并将它保存到数据库中。每个 PortfolioItem 都与一个 Product 关联,在某些时候我需要通过反向关系从 ProductPortfolioItem。这就是为什么我有 LinkingObjects 属性。问题是当我尝试遵守 Decodable 协议时。编译器给我一个错误 Cannot automatically synthesize 'Decodable' because 'LinkingObjects<PortfolioItem>' does not conform to 'Decodable' 。如何处理?我在网上对 LinkingObjects 和 Decodable 的了解很少,我不知道如何处理这个问题。

class PortfolioItem: Object {

    @objc dynamic var id: String = ""
    @objc dynamic var productId: String = ""

    @objc dynamic public var product: Product?

    convenience init(id: String, productId: String) {
        self.init()
        self.id = id
    }

}

final class Product: Object, Decodable {

    @objc dynamic var id: String = ""
    @objc dynamic var name: String = ""

    private let portfolioItems = LinkingObjects(fromType: PortfolioItem.self, property: "product")

    public var portfolioItem: PortfolioItem? {
        return portfolioItems.first
    }

    convenience init(id: String, name: String) {
        self.init()
        self.id = id
    }
}

非常感谢 Chris Shaw 帮助我解决了这个问题。我写了一篇更深入的文章如何设置 Decodable 和 LinkingObjects,look HERE

嗯,除非我遗漏了什么,否则 LinkingObjects 属性不需要包含在解码中。

我这里的假设是您从某个在线资源接收 JSON,其中 Product 的 JSON 包含 { id: "", name: "" }.只要你正确地创建了 PortfolioItem 和关联的 Product,那么生成的 LinkingObjects 属性 就是 Realm 中动态查询的结果(因此可以在没有任何 JSON 来源)。

我今天无法测试编译答案,但您应该能够使用 CodingKeys 简单地排除 属性,即将其添加到 Product:-

private enum CodingKeys: String, CodingKey {
    case id
    case name
}

此外,不相关,但请注意,您的 convenience init 函数并未初始化您传入的所有属性。