代码之家  ›  专栏  ›  技术社区  ›  Tarvo Mäesepp

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

  •  0
  • Tarvo Mäesepp  · 技术社区  · 7 年前

    我正在重新整理我的手机 tableView 但问题是我有两张桌子。我使用Realm的数据库来存储数据,所以我的数据来自那里,而且我受到了某种程度的限制。在SQL中,我会连接表来实现我想要的,但我知道Realm是一个基于对象的数据库,因此查询中的连接概念不适用于它。

    假设我有 Class Parent Child

    @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>!

    就像这样,我从数据库中赋值:

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

    现在让我们假设我有约翰和彼得。彼得有两个孩子(蒂姆(1岁)和汤姆(3岁))。约翰有一个孩子托马斯(两岁)。所以父母的顺序应该是彼得和约翰

    我什么都试过了,但找不到答案。

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

    1 回复  |  直到 7 年前
        1
  •  1
  •   Dan Karbayev    7 年前

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

    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")
    

    这可能看起来很不方便,因为它引入了多对多关系,而不是一对多关系,但通过这种方式,领域将负责提供反向关系。