使用 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 按多个属性排序的主要内容,如果未能解决你的问题,请参考以下文章