极限领域结果

Limit Realm results

如何限制 Realm returns 的对象数量? .findAll returns 所有与查询匹配的行,.findFirst returns 只有第一行。但是像前 1000 这样的东西呢? .findAll 可能 return 太多行,以至于它消耗了太多内存。

很酷的是,使用 Realm,您无需担心这一点。当您访问对象及其字段时,查询返回的结果对象会延迟加载。您的对象永远不会被复制,因此只在 memory/disk.

中表示一次

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

一种方法可能是这样,如果你真的只想要 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();

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());

经过这么多天使用官方文档中的 "between" 查询,我找到了实现此目的的解决方案 https://realm.io/docs/java/latest

如果你想获取前 N 个元素,只需将计数从和到的字段名称传递如下

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

其中,

"count" = 字段名称(即 pojo 中的变量名称)
"0" = 范围从
"1000" = 范围为

例如:上面的查询将首先获取 0 到 1000 作为 RealmResults。

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