我正在使用面向iOS 8并使用Realm的Swift 2.2中编写应用程序。我允许用户使用Results.sorted(_:ascending:)
基于各种可选属性对对象进行排序。这适用于降序排序,但对于升序排序,nil
值首先放置,看起来不正确。许多数据库系统都有NULLS FIRST/LAST
选项,而使用CoreData,看起来可能subclass NSSortDescriptor
。在Realm中排序时,有没有办法始终将nil
值放在最后?即使只有一个hacky策略,也会受到赞赏。
答案 0 :(得分:5)
Results
方法提供的内容之外, Realm不支持Results.sorted(_:ascending:)
的自定义排序。但是你可以通过连接两个查询来相当容易地编写它,甚至可以通过计算属性公开它:
var results: [MyModel] {
let sorted = realm.objects(MyModel).sorted("...", ascending: true)
return sorted.filter("optionalProperty != nil") +
sorted.filter("optionalProperty == nil")
}
答案 1 :(得分:0)
在我的情况下,多个查询会很困难,因为在大多数情况下,我的数据源已经与其他排序优先级一起执行,我只需要在一种情况下进行自定义nil排序。它也很可能有数百或数千个结果,我宁愿不通过连接结果保留在内存中。
因此,虽然这不理想,但我选择存储hasStartDate: Bool
属性,该属性由计算属性date: Date?
自动更新,并使用自定义setter更新存储的startDate: Date?
和{{ 1}}属性。 hasStartDate
也在我的对象的初始值设定项中设置。
这允许我使用:
hasStartDate
这将返回realm.objects(SMItem.self).filter(predicate).sorted(by: [
SortDescriptor(keyPath: "hasStartDate", ascending: false),
SortDescriptor(keyPath: "startDate", ascending: true)
])
升序的对象,后跟没有startDate
的对象。