Tapani
Tapani

Reputation: 3231

Limit Realm results

How do I limit the amount of objects Realm returns? .findAll returns all rows matching the query and .findFirst returns only the first. But what about something like first 1000? .findAll may return so many rows that it consumes way too much memory.

Upvotes: 11

Views: 9460

Answers (4)

Chandru
Chandru

Reputation: 5962

I figured out the solution to achieve this after so many days using "between" query as found in the official docs https://realm.io/docs/java/latest

If you want to fetch first N elements, Simply pass the count from and to with field name as below

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

Where,

"count" = Field name (i.e variable name in your pojo)
"0" = Range From
"1000" = Range to

For example: The above query will fetch first 0 to 1000 as RealmResults.

Note: The above solution works only if you have some unique id with row count. In my case I manually inserted row count value before inserting the values into Realm.

Upvotes: 1

saksham
saksham

Reputation: 3324

Realm currently do not provide any limit function but if you want first N elements

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

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

for last N elements

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

Upvotes: 0

bmunk
bmunk

Reputation: 1578

The cool thing is that you don't need to worry about that with Realm. The result object returned from a query is lazily loading the objects and its fields when you access them. Your objects are never copied and thus only represented once in memory/disk.

The (current) implementation detail of this is that the RealmResults object returned from a query is just a list of references to the matching objects. Those references are tiny numbers which are stored compressed so they take up very little memory. So even with 100.000 matches it actually wouldn't take up much memory. And it would take up the same amount of memory for all kind of objects, whether they have one int field or hundreds of fields with strings or big binaries.

Upvotes: 17

ahmadalibaloch
ahmadalibaloch

Reputation: 6021

One way could be this, if you really want only RealmResults, using Stream limit method:

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

Upvotes: 0

Related Questions