Realm.io Android从表中获取最后20个项目的最佳方法

时间:2015-01-30 05:39:22

标签: android realm

在表格中说100项,这是获得最后20个对象的最佳方法。

我能想到的一种方法是加载所有对象,反转数组,创建一个新数组并从结果循环20次以填充新数组并返回它。

如下所示:

 public ArrayList<DataObject> getLastItems (int qty){

    RealmResults<DataObject>results = realm.where(DataObject.class).findAll();

    Collections.reverse(results);

    ArrayList<DataObject>arrayList = new ArrayList<>();

    for (int i = 0; i == qty; i++){

        arrayList.add(results.get(i));

    }

    return arrayList;
}

使用realm.io有没有更好的方法在Android中执行此操作?

更新

到目前为止,这是如何处理的..

  public ArrayList<DataObject> getLastItems (int qty){

    RealmResults<DataObject>results = realm.where(DataObject.class).findAll();
    ArrayList<DataObject> arrayList = new ArrayList<>();
    for (int i = results.size(); i > Math.max(results.size() - 20, 0) ; i--) {
        arrayList.add(results.get(i-1));
    }

    return arrayList;
}

5 个答案:

答案 0 :(得分:7)

另请注意,Realm表是无序的。将它们想象成放置数据的包。这意味着如果您想要插入最后20个项目,则需要添加一个字段以包含插入时间。这样做还可以让您非常有效地实现您想要的结果:

RealmResults<DataObject>results =
    realm.where(DataObject.class)
         .findAllSorted("timestamp", RealmResults.SORT_ORDER_DESCENDING);

for (int i = 0; i < 20; i++) {
    // do magic here
}

答案 1 :(得分:6)

这个问题几乎已经关闭,但我找到了另一种方法来弄清楚这种情况,我不知道是不是最好的选择还是一个好的做法,@ ChristianMelchior可以说比我更好(我看到你的合作与领域项目)...好吧,代码说的不仅仅是文字。

RealmResults<Appointment> appointments; 
List<Appointment> appointments = appointments.subList(0, appointments.size());

正如我们所看到的,回答你的问题约翰,你可以改变索引来获得你想要的所有对象!

答案 2 :(得分:2)

RealmResults只创建您实际使用的对象,因此迭代所有对象以反转列表将是非常糟糕的性能。相反,作为bmunk描述,你应该找到正确的索引并从那里开始,如下所示。请注意,Realms是无序的,因此如果没有排序,返回的项目将无法很好地定义。

public ArrayList<DataObject> getLastItems (int qty){
    RealmResults<DataObject>results = realm.where(DataObject.class).findAll().sort("fieldName");
    ArrayList<DataObject> arrayList = new ArrayList<>();
    for (int i = Math.max(result.size() - 20, 0); i < results.size() ; i++) {
        arrayList.add(results.get(i));
    }

    return arrayList;
}

答案 3 :(得分:1)

这样做

DataTable dt = GetSomeData();
dt.DeleteRows(r => r.Field<double>("Amount") > 123.12 && r.Field<string>("ABC") == "XYZ");

答案 4 :(得分:0)

除非严格要求,否则您应该尽量避免复制对象。完成findAll()后,您已经获得了一个有序列表。然后你可以使用max(results.size() - 20,0)来知道从哪个索引开始迭代而不是复制。