我有一个这样定义的模型类:
class BaseModel: Object {
var data: JSON = JSON.null
convenience init(_ data: JSON) {
self.init()
self.data = data
}
override static func ignoredProperties() -> [String] {
return ["data"]
}
}
class RecipeModel: BaseModel {
dynamic var title: String {
get { return data["fields"]["title"].stringValue }
set { self.title = newValue }
}
... more vars ...
var ingredients: List<IngredientsModel> {
get {
let ingredients = List<IngredientsModel>()
for item in data["fields"]["ingredients"] {
ingredients.append(IngredientsModel(item.1))
}
return ingredients
}
set { self.ingredients = newValue }
}
}
class IngredientsModel: BaseModel {
dynamic var text: String {
get { return data["text"].stringValue }
set { self.text = newValue }
}
... more vars ...
}
我想像这样使用它:
Api.shared.fetchAllEntries().call(onSuccess: {response in
print(response.json)
let realm = try! Realm()
try! realm.write {
realm.deleteAll()
}
for item in response.json["items"].arrayValue {
let recipe = RecipeModel(item)
try! realm.write {
realm.add(recipe)
}
}
}, onError: {
print("error")
})
所以基本上我的想法是将整个 JSON 传递给初始的 RecipeModel
类,它应该解析它并在 Realm 数据库中创建我需要的对象。除了 IngredientsModel
的嵌套列表外,它工作得很好。它们不会被添加到 Realm 数据库中。
我认为潜在的问题是,我在 convenience init
中调用 self.data
之前调用了 self.init()
,但我看不出有什么办法可以解决这个问题。你们知道我如何实现 IngredientsModel
正确设置其内容并且我在 RecipeModel
中有成分列表吗?
最佳答案
您当前的实现不起作用,因为您没有在 RecipeModel
的 init
方法中调用 ingredients
的 getter/setter 和因此 IngredientsModel
实例永远不会保留在 Realm 中。
此外,将计算属性用作一对多关系( Realm 列表)是一个非常糟糕的主意,尤其是当您在该属性的 getter 中解析结果时。每次你调用 ingredients
的 getter 时,你都会创建新的模型对象,而不是仅仅访问已经存储在 Realm 中的现有模型对象,但你永远不会删除旧的。如果您实际上是将 IngredientsModel
实例保存到 Realm(如上所述,您目前没有这样做),您会发现您的数据库充满了重复的条目。
您的整个方法似乎并不理想。您不应该将未解析的 data
对象存储在您的模型类中并使用计算属性来解析它。您应该在初始化模型时解析它,根本不应该存储未解析的数据。您可以使用 ObjectMapper用于直接从 JSON 响应创建 Realm 对象的库。
关于ios - Realm - 对象中的对象列表(Swift 3),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46036843/