在Realm中将一个对象链接到多个

时间:2016-05-18 21:27:07

标签: ios swift realm

我停下来有很多方向。我已经设法使用函数'linkingObjects'来做到这一点,但自上次更新以来,它已被弃用,我应该使用对象'LinkingObjects'。

停止

class Stop: Object {
    dynamic var name:String = ""
    var directions = List<Direction>()

    override static func primaryKey() -> String? {
        return "name"
    }
}

旧方向

class Direction: Object {
    dynamic var tag:String = ""
    var stop:Stop? {
        return linkingObjects(Stop.self, forProperty: "directions").first
    }
}

当我将以前的方法应用于新对象时,我总是得到nil

LinkingObjects返回nil的新方向

class Direction: Object {
    dynamic var tag:String = ""
    let stop = LinkingObjects(fromType: Stop.self, property: "directions").first //always return nil
}

但是在这里我得到一个元素的数组。所以它应该工作。

LinkingObjects返回nil的新方向

class Direction: Object {
    dynamic var tag:String = ""
    let stops = LinkingObjects(fromType: Stop.self, property: "directions")
}

问题

还有其他方法可以使用'LinkingObjects'而不是最后一个例子,因为每次使用'direction.stop.first?.name'而不是'direction.stop?.stop'?

当然,我可以使用'direction'功能,它总是会在'stop'中选择第一个元素,但也许我不需要。

更新

与此同时,我正在使用它。这不是理想的解决方案,但有效。

private let stops:LinkingObjects<Stop> = LinkingObjects(fromType: Stop.self, property: "directions")
var stop:Stop? {
    return self.stops.first
}

2 个答案:

答案 0 :(得分:1)

你现在提出的解决方案是你能做的最好的。

我们讨论了是否应该公开任何其他API用于单一反向链接,但是因为没有办法在数据存储层上强制实现它们的多样性,所以到目前为止它没有意义。此外,您仍然需要一个包装器对象,以便我们可以传播更新。出于这个原因,到目前为止,通过LinkedObjects检索值的统一方法似乎是这样。

答案 1 :(得分:0)

如何以相反的方式指定关系呢?

  • 在'one'侧指定连接
  • 在'many'一侧的getter中进行查询:

所以它应该是这样的:

class Child: Object {

    dynamic var name:String = ""
    dynamic var parent:Parent? = nil

}

class Parent: Object {

    dynamic var name:String = ""

    var children:Results<Child>? {
        return realm?.objects(Child.self).filter(NSPredicate(format: "parent == %@", self))
    }

}