zardon
zardon

Reputation: 1651

Swift - Get the parent of a Realm object; Always empty

I've got a relationship where:

A Parent has many Children

ie:

class Factory: Object {
public let engines = List<Engine>()
}

class Engine:Object {
private let parents:LinkingObjects<Factory> = LinkingObjects(fromType: Factory.self, property: "engines")
    var parent:Factory? {
        return self.parents.first
    }
}

I read the factories via JSON and create the children (Engine) manually in a for-loop, similar to this:

var engines:[Engine] = [Engine]()
for _ in stride(from:0, to: 3, by: 1) {
let engine: Engine = Engine.init()
engines.append(engine)
}
return engines

In my test I want to query the parent of a given engine to ensure that the parent is correct; or perhaps get a parent attribute.

However, whenever I try to grab an attribute via the parent its always empty;

for (_, element) in (factories.enumerated()) {
  for (_, eng) in element.engines.enumerated() {
    print (eng.parent ?? "N/A" as Any)  // Always prints out N/A
  }
}

Ideally I want to be able to access the parent's data; like the name of the parent, perhaps costs, etc.

I've tried resetting simulator and also deleting derived data; but regardless of what I do the results are always N/A or empty.

How can I query the given element and ensure that I can grab the parent data?

Many thanks

Upvotes: 1

Views: 618

Answers (1)

zardon
zardon

Reputation: 1651

Turns out there were a number of issues that I had to do to resolve this.

I was using XCTest and Realm was causing issues where there were multiple targets.

  1. Make all my model classes' public
  2. Remove the models from the test target, this included a file where the JSON data was being loaded into memory
  3. I had to write my data into Realm, which I had not done;

            let realm = try! Realm()
    
            try! realm.write {
                for parent:EYLocomotive in objects {
                    for _ in stride(from:0, to: parent.qty, by: 1) {
                        let engine : EYEngine = EYEngine.init()
                        parent.engines.append(engine)
                    }
                    realm.add(parent)
                }
             }
    

Upvotes: 1

Related Questions