使用 Realm 按多个属性排序

Posted

技术标签:

【中文标题】使用 Realm 按多个属性排序【英文标题】:Order by multiple properties using 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)

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

【问题讨论】:

【参考方案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 之类的东西以避免“字符串”代码是有道理的。

以上是关于使用 Realm 按多个属性排序的主要内容,如果未能解决你的问题,请参考以下文章

Tinysort 按多个属性排序(多于1个)

使用动态 LINQ 按一个或多个属性对 JSON 进行排序

Spring Data Rest - 按多个属性排序

具有多个属性的 SQL 排序(按一致性排序)

带有多个属性的对象的打字稿排序数组

如何在 Spring Data (JPA) 派生查询中按多个属性排序?