【问题标题】:Order by multiple properties using Realm使用 Realm 按多个属性排序
【发布时间】:2015-02-06 13:40:34
【问题描述】:

如何使用多个属性对我的 Realm 结果进行排序?

我首先使用这样的一个属性对它们进行排序:

allShows = Show.allObjects().sortedResultsUsingProperty("dateStart", ascending: true)

但现在我还想通过另一个属性“timeStart”进行二次排序。我试过这样:

allShows = Show.allObjects().sortedResultsUsingProperty("dateStart", ascending: true).sortedResultsUsingProperty("timeStart", ascending: true)

这只会使结果仅按第二个属性排序。请帮忙。

【问题讨论】:

    标签: ios swift realm


    【解决方案1】:

    这样想的:

    let sortProperties = [RLMSortDescriptor(property: "dateStart", ascending: true), RLMSortDescriptor(property: "timeStart", ascending: true)]
    allShowsByDate = Show.allObjects().sortedResultsUsingDescriptors(sortProperties)
    

    【讨论】:

    • 看起来他们将 RLMSortDescriptor 重构为 SortDescriptor
    • 知道如何在 RealmSwift 中实现这一点吗?
    • 如果属性是一个对象怎么办?
    【解决方案2】:

    在 RealmSwift 中,我们可以像这样编写多个属性:

    let sortProperties = [SortDescriptor(property: "dateStart", ascending: true), SortDescriptor(property: "timeStart", ascending: true)]
    allShowsByDate = Realm().objects(MyObjectType).sorted(sortProperties)
    

    如果你想使用更多的属性,你可以将SortDescriptor()的值添加到数组中。

    【讨论】:

    • 如何使用自定义函数进行多重排序?
    • @TomSawyer 你可以使用这个方法 sort({ (first, second) -> Bool in if first.startDate.compare( second.startDate ) == .Ascending { return true } else { return false } })
    • @AIG 如果有嵌套的可选类型属性,我们将如何对其进行排序。
    • 在 Swift 4 中,您现在必须使用 .sorted(by: sortProperties)
    【解决方案3】:

    我找到了解决方案。

    var dataSource: Results<DLVCasting>! = nil
    let realm = try! Realm()
    let sortDescriptors = [SortDescriptor(property: "someValue", ascending: false)]
    dataSource = realm.objects(MyClass.self).sorted(sortDescriptors);
    dataSource = dataSource.sorted("anotherValue", ascending: false)
    

    但是,如果您在数组中放置多个排序描述,如下例所示

    let sortDescriptors = [SortDescriptor(property: "someValue", ascending: false),SortDescriptor(property: "someValue", ascending: false)]
    

    这行不通。我真的不明白为什么。

    【讨论】:

    • 如果我放置多个排序描述,这也不起作用。我也真的不明白为什么。
    【解决方案4】:

    这是从 Realm 2.5 开始的方法

          dataArray = try! Realm().objects(Book.self)
            .sorted( by: [SortDescriptor(keyPath: "Author", ascending: true), SortDescriptor(keyPath: "Title", ascending: true)] )
    

    【讨论】:

      【解决方案5】:

      针对 Swift 4 语法更新

      let sortProperties = [SortDescriptor(keyPath: "queue"), SortDescriptor(keyPath: "name")]
      let dogList = realm.objects(Dog.self).sorted(by: sortProperties)
      

      【讨论】:

      • 如果定义了字段,领域对象模型为我们提供了诸如 Dog.fields.queue.name 之类的东西以避免“字符串”代码是有道理的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-22
      • 2011-11-24
      • 2016-01-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多