使用 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(_:)成员函数。这个函数接受SortDescriptors的序列,它们是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?

使用 Swift 过滤 Realm 对象

NSPredicate 使用 RLMResults 作为参数

NSPredicate 更改时不会触发领域通知

如何制作正确过滤本地字符的 NSPredicate?

Realm android中的逻辑AND操作