领域按属性和在另一个表中排序

时间:2018-03-13 09:54:46

标签: swift realm

我试图在最高年龄的tableView重新排序我的单元格,但问题是我有两张桌子。我使用Realm的数据库来存储数据,所以我的数据来自那里,而且我在某种程度上是有限的。在SQL中我会连接表来实现我想要的但我知道Realm是一个基于对象的数据库,因此查询中的连接概念不适用于它。

假设我有Class ParentChild

@objcMembers class Parent: Object{
    dynamic var name: String = ""
    let children = List<Child>()

    convenience init(name: String) {
        self.init()
        self.name = name
    }

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

@objcMembers class Child: Object{
        dynamic var name: String = ""
        dynamic var age: Int = 0
        dynamic var parent: Parent? = nil

        convenience init(name: String, age: Int) {
            self.init()
            self.name = name
            self.age = age
        }

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

然后我有两个变量:

  1. var parentsArray: Results<Parent>!
  2. var childrenArray: Results<Child>!
  3. 像这样我从数据库中分配值:

    parentsArray = realm.objects(Parent.self)
    childrenArray = realm.objects(Child.self)
    

    现在我要说约翰和彼得。彼得有两个孩子(蒂姆(年龄= 1)和汤姆(年龄= 3))。约翰有一个小孩托马斯(年龄= 2)。所以父母的命令应该是彼得和约翰

    我已经尝试了一切,但找不到答案。

    所以我的问题是,你应该如何按照给定的标准订购?

1 个答案:

答案 0 :(得分:1)

您可以使用自定义排序功能对父级数组进行排序:

let sorted = parentsArray.sorted {
  ($0.children.sum(ofProperty: "age") as Int) > ($1.children.sum(ofProperty: "age") as Int)
}

因此,如果您需要按孩子的最大年龄排序,您只需使用其他功能:

$0.children.max(ofProperty: "age") as Int

作为旁注,dynamic var parent: Parent? = nil表示您手动设置父级。相反,您应该使用LinkingObjects - 链接到当前对象的对象列表:

let parents = LinkingObjects(fromType: Parent.self, property: "children")

这可能看起来不方便,因为它引入了多对多关系而不是一对多关系,但这样Realm将负责提供反向关系。