Swift Realm.io API自动映射父对象

Swift Realm.io API自动映射父对象,swift,realm,Swift,Realm,我使用领域及其映射方法将JSON数据自动映射到我的模型及其子关系。它工作得很好,除非我在引用父模型的子模型上添加关系。映射完全失控,创建了不存在的其他条目 父模型: class Foo: Object { dynamic var id = 0 dynamic var title = "" let bars = List<Bar>() // Children override class func primaryKey() -> String { ret

我使用领域及其映射方法将JSON数据自动映射到我的模型及其子关系。它工作得很好,除非我在引用父模型的子模型上添加关系。映射完全失控,创建了不存在的其他条目

父模型:

class Foo: Object {
  dynamic var id = 0
  dynamic var title = ""
  let bars = List<Bar>() // Children

  override class func primaryKey() -> String {
    return "id"
  }
}
根据本文,我正在使用便利方法映射JSON:

let foos = JSON["foos"] as! [NSDictionary]
  let realm = Realm()
  realm.write {
    for foo in foos {
      realm.create(Foo.self, value: foo, update: true)
    }
  }

我知道我可以手动设置映射,但如果可能的话,我想使用方便的方法。有人知道如何设置这个吗?

我想你最好使用
反向关系来代替ToOne关系。
Foo
类将是相同的。但是您将在
Bar
类中更改
foo
属性,如下所示

    class Bar: Object {
        dynamic var id = 0
        dynamic var title = ""
       //dynamic var foo = Foo() // Reference to parent
        dynamic var foo: FOO {
        // Realm doesn't persist this property because it only has a getter defined
        // Define "foo" as the inverse relationship to Foo.bars
        return linkingObjects(Bar.self, forProperty: "bars").first as! Foo
       }

      override class func primaryKey() -> String {
          return "id        
      }
   }

我认为你最好使用
反向关系
来代替ToOne关系。
Foo
类将是相同的。但是您将在
Bar
类中更改
foo
属性,如下所示

    class Bar: Object {
        dynamic var id = 0
        dynamic var title = ""
       //dynamic var foo = Foo() // Reference to parent
        dynamic var foo: FOO {
        // Realm doesn't persist this property because it only has a getter defined
        // Define "foo" as the inverse relationship to Foo.bars
        return linkingObjects(Bar.self, forProperty: "bars").first as! Foo
       }

      override class func primaryKey() -> String {
          return "id        
      }
   }

伊斯梅尔的答案是正确的,我对此投了更高的票:Realm的查询引擎只适用于数据库中持久化的属性。如果要添加持久化的反向链接属性,必须自己设置

例如:

let foos = JSON["foos"] as! [NSDictionary]
let realm = Realm()
realm.write {
  for foo in foos {
    let persistedFoo = realm.create(Foo.self, value: foo, update: true)
    for bar in persistedFoo.bars {
      bar.foo = foo
    }
  }
}

伊斯梅尔的答案是正确的,我对此投了更高的票:Realm的查询引擎只适用于数据库中持久化的属性。如果要添加持久化的反向链接属性,必须自己设置

例如:

let foos = JSON["foos"] as! [NSDictionary]
let realm = Realm()
realm.write {
  for foo in foos {
    let persistedFoo = realm.create(Foo.self, value: foo, update: true)
    for bar in persistedFoo.bars {
      bar.foo = foo
    }
  }
}

let bars=List()
不应该是
let bars=List()
let bars=List()
不应该是
let bars=List()
谢谢-代码
返回链接对象(Foo.self,forProperty:“bars”)。首先是使此计算属性工作的原因。然而不幸的是,我无法用它进行领域查询,例如:
Realm().objects(Bar).filter(“foo==%@”,foo)
失败,错误是在类型为“Bar”的对象中找不到
'Property'foo'。谢谢-代码
返回linkingObjects(foo.self,forProperty:“Bar”)。首先是使此计算属性工作的原因。然而不幸的是,我无法用它进行领域查询,例如:
Realm().objects(Bar).filter(“foo==%@”,foo)
失败,错误是在类型为“Bar”的对象中找不到
'Property'foo'。谢谢,是的,他的答案是正确的,我没有预料到需要指定我将对其执行查询。但这解决了问题,谢谢!谢谢,是的,他的回答是正确的,我没有预料到需要指定我将对其执行查询。但这解决了问题,谢谢!