使用 Realm 和 NSPredicate 按数组索引排序
Posted
技术标签:
【中文标题】使用 Realm 和 NSPredicate 按数组索引排序【英文标题】:Sort by array index using Realm and NSPredicate 【发布时间】:2015-10-20 19:07:03 【问题描述】:我有一个 ID 数组:[INT]。现在我想选择所有具有这些id的对象,但需要按照ids数组中id的顺序。
let IDs = [2, 6, 3, 4, 10, 9]
let predicate = NSPredicate(format: "id IN %@", IDs)
let objects = realm.objects(Item.self).filter(predicate)
但最终,对象的排序方式与 ID 不同。有什么方法可以按正确的顺序对这些对象进行排序?
【问题讨论】:
【参考方案1】:您可以使用sort()
:
let IDs = [2, 6, 3, 4, 10, 9]
let predicate = NSPredicate(format: "id IN %@", IDs)
do
let realm = try Realm()
let objects = realm.objects(Item).filter(predicate).sort( IDs.indexOf($0.id) < IDs.indexOf($1.id) )
catch
【讨论】:
这种方法将物化每个匹配查询的单个对象的 Swift 类实例以执行排序操作。使用Results.sorted(_:)
来避免这种急切的实现。但是,对于应用 Realm 不支持的自定义排序算法,这种方法很好(甚至是必要的)。
谢谢。这行得通。但是,我们需要在使用 .sort 之前实现所有对象。但是,Results.sorted 无法检测 IDs 数组中 id 的顺序。
问题要求自定义排序算法,因此无法实现对象。【参考方案2】:
在Realm中,Results
符合RealmCollectionType
协议,它有一个sorted(_:)
成员函数。这个函数接受SortDescriptor
s的序列,它们是StringLiteralConvertible
,使它们非常容易使用:
let realm = try! Realm()
let IDs = [2, 6, 3, 4, 10, 9]
let objects = realm.objects(Item).filter("id IN %@", IDs).sorted(["id"])
【讨论】:
我尝试使用 sorted("id") 但这不是我需要的。我想按照数组 ID 中的 id 顺序对项目进行排序。 我明白了。那么 joern 的回答是目前最好的方法。以上是关于使用 Realm 和 NSPredicate 按数组索引排序的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Realm 中设置 NSPredicate 以找到 totalPrice > X?