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
}

我更改了我的代码来执行此操作;

  1. 读取JSON
  2. 中的所有工厂
  3. 遍历工厂,创建引擎
  4. 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 的回答。