如何限制Realm返回的对象数量? .findAll返回与查询匹配的所有行,而.findFirst仅返回第一行。但是像1000年前的那样呢? .findAll可能返回这么多行,消耗太多内存。
答案 0 :(得分:15)
很酷的是你不需要担心Realm。从查询返回的结果对象在您访问它们时会懒惰地加载对象及其字段。您的对象永远不会被复制,因此只在内存/磁盘中表示一次。
(当前)实现细节是从查询返回的RealmResults对象只是对匹配对象的引用列表。这些引用是微小的数字,它们被压缩存储,因此占用的内存非常少。因此,即使有100.000匹配,它实际上也不会占用太多内存。对于所有类型的对象,它将占用相同数量的内存,无论它们是一个int字段还是数百个带字符串或大二进制字段的字段。
答案 1 :(得分:1)
我找到了解决这个问题的方法,经过这么多天使用"之间的#34;查询在官方文档https://realm.io/docs/java/latest
中找到如果你想获取前N个元素,只需将数字从,然后传递给字段名称,如下所示
realm.where(clazz).between("count",0,1000).findAll();
其中,
" count" =字段名称(即pojo中的变量名称)
" 0" =范围来自
" 1000" =范围
例如:上面的查询将首先从RealmResults获取0到1000。
注意:上述解决方案仅在您拥有行计数的唯一ID时才有效。在我的情况下,我在将值插入Realm之前手动插入行计数值。
答案 2 :(得分:0)
如果您真的只想RealmResults
,使用Stream limit
方法,可能会出现这种情况:
//get all results of your choice query
RealmResults<TypeClass> entities = realm.where(TypeClass.class).findAll();
//limit using Stream
List<Integer> ids = Stream.of(entities).limit(10).map(x -> x.Id).collect(Collectors.toList());
//return only those ids elments
return realm.where(TypeClass.class).in("Id", ids.toArray(new Integer[])).findAll();
答案 3 :(得分:0)
Realm目前不提供任何限制功能,但如果你想要前N个元素
int N=10; // whatever value you want
Realm mRealm=Realm.getDefaultInstance();
RealmResults<Example> list= mRealm.where(Example.class).findAll();
list.subList(0,N);
最后N个元素
RealmResults<Example> list= mRealm.where(Example.class).findAll();
list.subList(list.size()-N,list.size());