在表格中说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;
}
答案 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)来知道从哪个索引开始迭代而不是复制。