【问题标题】:RealmSwift LinkingObjects and DecodableRealmSwift LinkingObjects 和 Decodable
【发布时间】:2019-03-27 19:19:18
【问题描述】:

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

【问题讨论】:

  • 部分问题是它不是一个原语(String、Num、bool 等),因此您需要为此用例包含额外的代码。您是否尝试使用JSONDecoder().decode(
  • 是的,我正在尝试那样做。

标签: swift realm realm-mobile-platform


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 哇,很棒的答案。这可以正常工作,请务必修改 convenience init 以包含 self.name = name
猜你喜欢
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多