RealmSwift LinkingObjects 和 Decodable
RealmSwift LinkingObjects and Decodable
我有一个 Realm 模型 class,我需要它是可解码的,这样我就可以从 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。
嗯,除非我遗漏了什么,否则 LinkingObjects
属性不需要包含在解码中。
我这里的假设是您从某个在线资源接收 JSON,其中 Product
的 JSON 包含 { id: "", name: "" }.只要你正确地创建了 PortfolioItem
和关联的 Product
,那么生成的 LinkingObjects
属性 就是 Realm 中动态查询的结果(因此可以在没有任何 JSON 来源)。
我今天无法测试编译答案,但您应该能够使用 CodingKeys 简单地排除 属性,即将其添加到 Product
:-
private enum CodingKeys: String, CodingKey {
case id
case name
}
此外,不相关,但请注意,您的 convenience init
函数并未初始化您传入的所有属性。
我有一个 Realm 模型 class,我需要它是可解码的,这样我就可以从 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。
嗯,除非我遗漏了什么,否则 LinkingObjects
属性不需要包含在解码中。
我这里的假设是您从某个在线资源接收 JSON,其中 Product
的 JSON 包含 { id: "", name: "" }.只要你正确地创建了 PortfolioItem
和关联的 Product
,那么生成的 LinkingObjects
属性 就是 Realm 中动态查询的结果(因此可以在没有任何 JSON 来源)。
我今天无法测试编译答案,但您应该能够使用 CodingKeys 简单地排除 属性,即将其添加到 Product
:-
private enum CodingKeys: String, CodingKey {
case id
case name
}
此外,不相关,但请注意,您的 convenience init
函数并未初始化您传入的所有属性。