Swift 领域 - 创建 child 领域 objects 并将它们链接到它们的 parent
Swift Realm - Creating child Realm objects and linking them to their parent
我目前正在学习 Realm 并将使用数组的实验性 app/game 转换为 Realm;
它通过本地 JSON 文件和 ObjectMapper 加载 pre-seeding 数据;然后在领域中创建 objects;这部分似乎有效。
// Parse response
let json = try! JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.mutableContainers) as! Array<Dictionary<String, AnyObject>>
let factories = Mapper<Factory>().mapArray(JSONArray: json)!
do {
let realm = try Realm()
try realm.write {
for factory in factories
{
realm.add(factory, update: true)
}
}
} catch let error as NSError {
print(error.localizedDescription as Any)
}
我遇到的问题是,当它映射时;我希望它同时创建 child objects 并将它们 link 到 parent.
每个 parent (Factory
) 大约有 4 children (Engine
) linked 到它。
// Factory is parent object
class Factory: Object, Mappable {
dynamic var name: String = ""
let engines = List<Engine>()
//Impl. of Mappable protocol
required convenience init?(map: Map) {
self.init()
}
// Mappable
func mapping(map: Map) {
name <- map["name"]
}
}
// Engine is a child to Factory
class Engine: Object {
dynamic var production: Int = 0
// create children and add to the parent factory
static func createEngines(parent:Factory) -> [Engines]
{
var engines:[Engine] = [Engine]()
for _ in stride(from:0, to: 3, by: 1) {
//let engine : Engine = Engine.init(parent: element)
//engines.append(engine)
}
return engines
}
}
如果我尝试将其放入我的可映射
engines = Engine.createEngines(parent: self)
并更改我的工厂模型;
`var engines = List<Engine>()`
我收到这个错误:
Cannot assign value of type '[Engine]?' to type 'List<Engine>'
这里的问题是,简单地创建一个引擎数组 (children),将其附加到一个数组似乎不适用于 Realm,我不确定如何做到这一点。
因此,我的问题是如何批量创建 children,将其分配给给定的 parent 并将其添加到当前领域 write/save?
非常感谢。
Jerrot 有一个非常好的解决方案 here on Githib Gist
映射应该像这样在您的主模型对象中定义:
func mapping(map: Map) {
title <- map["title"]
products <- (map["products"], ArrayTransform<ProductModel>())
}
真正的魔法发生在 ArrayTransform
class:
func transformFromJSON(value: AnyObject?) -> List<T>? {
var result = List<T>()
if let tempArr = value as! Array<AnyObject>? {
for entry in tempArr {
let mapper = Mapper<T>()
let model : T = mapper.map(entry)!
result.append(model)
}
}
return result
}
我更改了我的代码来执行此操作;
- 读取JSON
中的所有工厂
- 遍历工厂,创建引擎
- Link parent object up.
我不确定我是否做对了,但它似乎有效。
我只是不喜欢我必须硬连线 parent;因为我认为 Realm/ObjectMapper 可以为我做到这一点。但这不是主要问题,因为只有大约 3 或 4 个关系。
let factories = Mapper<Factory>().mapArray(JSONArray: json)!
do {
let realm = try Realm()
try realm.write {
for f in factories
{
realm.add(f, update: true)
}
let factories = realm.objects(Factory.self)
print (factories.count) // for debug purposes
for f in factories {
for _ in stride(from: 0, to: f.qty, by: 1) {
let engine : Engine = Engine.init()
engine.parent = f
f.engines.append(engine)
}
}
}
} catch let error as NSError {
print(error.localizedDescription as Any)
}
上面的代码似乎对我有用;虽然我确实希望我不必手动设置 parent (engine.parent = f
)
无论如何,我已经接受了@BogdanFarca 的回答。
我目前正在学习 Realm 并将使用数组的实验性 app/game 转换为 Realm;
它通过本地 JSON 文件和 ObjectMapper 加载 pre-seeding 数据;然后在领域中创建 objects;这部分似乎有效。
// Parse response
let json = try! JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.mutableContainers) as! Array<Dictionary<String, AnyObject>>
let factories = Mapper<Factory>().mapArray(JSONArray: json)!
do {
let realm = try Realm()
try realm.write {
for factory in factories
{
realm.add(factory, update: true)
}
}
} catch let error as NSError {
print(error.localizedDescription as Any)
}
我遇到的问题是,当它映射时;我希望它同时创建 child objects 并将它们 link 到 parent.
每个 parent (Factory
) 大约有 4 children (Engine
) linked 到它。
// Factory is parent object
class Factory: Object, Mappable {
dynamic var name: String = ""
let engines = List<Engine>()
//Impl. of Mappable protocol
required convenience init?(map: Map) {
self.init()
}
// Mappable
func mapping(map: Map) {
name <- map["name"]
}
}
// Engine is a child to Factory
class Engine: Object {
dynamic var production: Int = 0
// create children and add to the parent factory
static func createEngines(parent:Factory) -> [Engines]
{
var engines:[Engine] = [Engine]()
for _ in stride(from:0, to: 3, by: 1) {
//let engine : Engine = Engine.init(parent: element)
//engines.append(engine)
}
return engines
}
}
如果我尝试将其放入我的可映射
engines = Engine.createEngines(parent: self)
并更改我的工厂模型;
`var engines = List<Engine>()`
我收到这个错误:
Cannot assign value of type '[Engine]?' to type 'List<Engine>'
这里的问题是,简单地创建一个引擎数组 (children),将其附加到一个数组似乎不适用于 Realm,我不确定如何做到这一点。
因此,我的问题是如何批量创建 children,将其分配给给定的 parent 并将其添加到当前领域 write/save?
非常感谢。
Jerrot 有一个非常好的解决方案 here on Githib Gist
映射应该像这样在您的主模型对象中定义:
func mapping(map: Map) {
title <- map["title"]
products <- (map["products"], ArrayTransform<ProductModel>())
}
真正的魔法发生在 ArrayTransform
class:
func transformFromJSON(value: AnyObject?) -> List<T>? {
var result = List<T>()
if let tempArr = value as! Array<AnyObject>? {
for entry in tempArr {
let mapper = Mapper<T>()
let model : T = mapper.map(entry)!
result.append(model)
}
}
return result
}
我更改了我的代码来执行此操作;
- 读取JSON 中的所有工厂
- 遍历工厂,创建引擎
- Link parent object up.
我不确定我是否做对了,但它似乎有效。
我只是不喜欢我必须硬连线 parent;因为我认为 Realm/ObjectMapper 可以为我做到这一点。但这不是主要问题,因为只有大约 3 或 4 个关系。
let factories = Mapper<Factory>().mapArray(JSONArray: json)!
do {
let realm = try Realm()
try realm.write {
for f in factories
{
realm.add(f, update: true)
}
let factories = realm.objects(Factory.self)
print (factories.count) // for debug purposes
for f in factories {
for _ in stride(from: 0, to: f.qty, by: 1) {
let engine : Engine = Engine.init()
engine.parent = f
f.engines.append(engine)
}
}
}
} catch let error as NSError {
print(error.localizedDescription as Any)
}
上面的代码似乎对我有用;虽然我确实希望我不必手动设置 parent (engine.parent = f
)
无论如何,我已经接受了@BogdanFarca 的回答。