RealmSwift链接对象和可解码

时间:2019-03-27 19:19:19

标签: swift realm realm-mobile-platform

我有一个Realm模型类,我需要将其解码,以便可以从JSON序列化并将其保存到数据库。每个PortfolioItem都与一个Product相关联,有时我需要通过逆关系从PortfolioItem进入Product。这就是为什么我拥有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

1 个答案:

答案 0 :(得分:3)

好吧,除非我遗漏了某些东西,否则LinkingObjects属性不需要包含在解码中。

我在这里的假设是,您正在从某个在线来源接收JSON,其中Product的JSON由{id:“”,name:“”}组成。只要您使用关联的PortfolioItem正确创建Product,那么生成的LinkingObjects属性就是Realm中动态查询的结果(因此无需任何JSON源就可以工作)

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

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

也是无关的,但是请注意,您的convenience init函数不会初始化您要传入的所有属性。