如何使用 Realm 进行排序?

Posted

技术标签:

【中文标题】如何使用 Realm 进行排序?【英文标题】:How to sort using Realm? 【发布时间】:2016-03-20 21:36:13 【问题描述】:

我不知道如何使用 Realm 进行排序。我当前的代码是。

data = realm.objects(WorkoutSet)
data = data!.sorted("date")

我想日期Int 从高到低排序。文档需要更多信息,GitHub 链接会抛出 404 消息。

【问题讨论】:

你能解释一下'sort date and Int from 1 to 0'是什么意思吗? data! 中的感叹号 (!) 有什么作用? @JoshPinter 这意味着你在说“我 100% 确定 data 中有一个有效值”,所以继续打开它 @TimCastelijns 谢谢! 【参考方案1】:

您可以在sorted 方法中添加ascending 参数:

data = data!.sorted("date", ascending: false)

这会使用日期字段按降序对您的 WorkoutSet 进行排序。

更新

使用 Swift 3 和最新的 RealmSwift 版本,现在已更改为:

data = data!.sorted(byKeyPath: "date", ascending: false)

如果您想自己评估排序标准,您可以使用:

data = data!.sorted(by:  (lhsData, rhsData) -> Bool in
   return lshData.something > rhsData.something
)

但请注意,自己对结果进行排序确实会返回 Array 而不是 Realm Results 对象。这意味着会有性能和内存开销,因为Results 是惰性的,如果使用上述方法进行排序,您将失去这种惰性行为,因为 Realm 必须评估每个对象!你应该尽可能坚持结果。如果确实没有其他方法可以对您的项目进行排序,请仅使用上述方法。

【讨论】:

我认为我们需要在 中包装升序:false, as sorted("date", ascending:false) 不,这不正确。 ascending 是一个简单的布尔参数。请在上面查看我的更新答案。 啊,是的,正如您所澄清的,它与 Swift 一起使用。使用 Realm javascript,我们需要使用我所说的 sorted("date", ascending:false)【参考方案2】:

使用 Sort.ASCENDING 或 Sort.DESCENDING

import java.util.Date;

import io.realm.RealmModel;
import io.realm.annotations.Index;
import io.realm.annotations.PrimaryKey;
import io.realm.annotations.RealmClass;
import io.realm.annotations.Required;

@RealmClass
public class Pojo implements RealmModel 
    @Index
    @Required
    @PrimaryKey
    protected Long id;
    protected Date data_field;
    protected int int_field;

    public Long getId() 
        return id;
    

    public void setId(Long id) 
        this.id = id;
    


import java.util.List;

import io.realm.Realm;
import io.realm.RealmQuery;
import io.realm.RealmResults;
import io.realm.Sort;

public class Dao 
    public List<Pojo> getAllById(Long id) 
        Realm realm = Realm.getDefaultInstance();
        RealmQuery<Pojo> query = realm.where(Pojo.class);
        query.equalTo("pojo_id", id);

        RealmResults<Pojo> result = query.findAll();

        result = result.sort("data_field", Sort.ASCENDING);
        result = result.sort("int_field", Sort.DESCENDING);

        //detaching it from realm (optional)
        List<Pojo> copied = realm.copyFromRealm(result);

        realm.close();

        return copied;
    

【讨论】:

问题是关于 Swift 中的 Realm 而不是 java。 我们可以像在 Mongodb 中那样对对象列表(数组)的领域查询结果进行排序吗?

以上是关于如何使用 Realm 进行排序?的主要内容,如果未能解决你的问题,请参考以下文章

什么时候/如何排序Realm孩子 Swift中UITableView的属性

如何使用最近日期对RealmResults进行排序?

如何使用 ObjectMapper 和 Realm 对象声明字典

如何使用 Realm 编写更好的数据访问层

如何在 Realm Mobile Platform 中管理会话?

使用 Realm 和 NSPredicate 按数组索引排序