Android 限制领域结果

Android 限制领域结果,android,realm,Android,Realm,如何限制领域返回的对象数量。findAll返回与查询匹配的所有行,findFirst只返回第一行。但是像前1000个这样的东西呢。findAll可能返回太多的行,以至于占用了太多的内存。最酷的是,你不需要担心Realm的问题。当您访问对象及其字段时,查询返回的结果对象将延迟加载这些对象及其字段。您的对象永远不会被复制,因此在内存/磁盘中只显示一次 (当前)实现细节是,从查询返回的RealmResults对象只是对匹配对象的引用列表。这些引用是压缩存储的微小数字,因此占用的内存很少。因此,即使有1

如何限制领域返回的对象数量。findAll返回与查询匹配的所有行,findFirst只返回第一行。但是像前1000个这样的东西呢。findAll可能返回太多的行,以至于占用了太多的内存。

最酷的是,你不需要担心Realm的问题。当您访问对象及其字段时,查询返回的结果对象将延迟加载这些对象及其字段。您的对象永远不会被复制,因此在内存/磁盘中只显示一次


(当前)实现细节是,从查询返回的RealmResults对象只是对匹配对象的引用列表。这些引用是压缩存储的微小数字,因此占用的内存很少。因此,即使有10万个匹配项,它实际上也不会占用太多内存。对于所有类型的对象,无论它们是一个int字段还是数百个带字符串或大二进制文件的字段,它都会占用相同的内存量。

如果您确实只想要
RealmResults
,则可以使用
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();
//获取所选查询的所有结果
RealmResults entities=realm.where(TypeClass.class).findAll();
//限制使用流
List Id=Stream.of(entities).limit(10).map(x->x.Id).collect(Collectors.toList());
//只返回那些ID
返回realm.where(TypeClass.class).in(“Id”,ids.toArray(新整数[])).findAll();

领域目前不提供任何限制功能,但如果您需要前N个元素

int N=10;   // whatever value you want
Realm mRealm=Realm.getDefaultInstance();

RealmResults<Example> list= mRealm.where(Example.class).findAll();
list.subList(0,N);
RealmResults<Example> list= mRealm.where(Example.class).findAll();
list.subList(list.size()-N,list.size());
int N=10;//无论你想要什么价值
Realm mRealm=Realm.getDefaultInstance();
RealmResults list=mRealm.where(Example.class).findAll();
列表。子列表(0,N);
对于最后N个元素

int N=10;   // whatever value you want
Realm mRealm=Realm.getDefaultInstance();

RealmResults<Example> list= mRealm.where(Example.class).findAll();
list.subList(0,N);
RealmResults<Example> list= mRealm.where(Example.class).findAll();
list.subList(list.size()-N,list.size());
RealmResults list=mRealm.where(Example.class).findAll();
list.subList(list.size()-N,list.size());

经过这么多天的使用官方文档中的“中间”查询,我找到了实现这一点的解决方案

如果要获取前N个元素,只需使用如下字段名将计数从和传递到

realm.where(clazz).between("count",0,1000).findAll();
在哪里,

“计数”=字段名(即pojo中的变量名)
“0”=范围从
“1000”=范围至

例如:上面的查询将获取前0到1000个RealmResults


注意:上述解决方案仅在您具有行计数的唯一id时有效。在我的例子中,在将值插入领域之前,我手动插入了行计数值。

不要忘记在“entities”的RealmChangeListener中重新计算这些值。如果使用copyFromRealm方法将领域结果存储到列表中会怎么样?那么您将复制所有对象,它们将占用普通Java对象的全部内存做如果你有很多结果,那真的是个坏主意。您总是希望避免复制我们的领域对象,除非您必须通过网络发送。当我们存储到realmResult中时,是否有任何方法删除特定列。因为我在一列中有大量数据,但我在领域结果pojo的recyclerview中显示了一些小大小的值。但正如答案中所解释的,realmResult本身并不复制数据,它只保存基础数据中对象“行”的索引,因此realmResult使用的内存与数据量和列数无关。