2015-04-24 15 views
8

Come limitare la quantità di oggetti che ritorna in Realm? .findAll restituisce tutte le righe corrispondenti alla query e .findFirst restituisce solo il primo. Ma che dire di qualcosa come il primo 1000? .findAll potrebbe restituire così tante righe che consuma troppa memoria.Limiti Risultati reame

risposta

13

La cosa bella è che non devi preoccuparti di ciò con il Reame. L'oggetto risultato restituito da una query carica pigramente gli oggetti e i relativi campi quando vi si accede. I tuoi oggetti non vengono mai copiati e quindi rappresentati solo una volta nella memoria/disco.

L'implementazione (corrente) di questo è che l'oggetto RealmResults restituito da una query è solo un elenco di riferimenti agli oggetti corrispondenti. Questi riferimenti sono numeri minuscoli che vengono memorizzati in modo da occupare pochissima memoria. Quindi, anche con 100.000 corrispondenze, in realtà non occuperebbe molta memoria. E richiederebbe la stessa quantità di memoria per tutti i tipi di oggetti, indipendentemente dal fatto che abbiano un campo int o centinaia di campi con stringhe o grossi binari.

0

Un modo potrebbe essere questo, se si vuole veramente solo RealmResults, utilizzando Streamlimit metodo:

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

Non dimenticare di ricalcolare questi in RealmChangeListener di 'entity''s – EpicPandaForce

0

Realm attualmente non forniscono alcuna funzione limite, ma se si desidera primi elementi N

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

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

per gli ultimi N elementi

1

Ho trovato la soluzione per ottenere questo risultato dopo tanti giorni utilizzando la query "tra" come trovata nei documenti ufficiali https://realm.io/docs/java/latest

Se si desidera recuperare i primi N elementi, è sufficiente passare il conteggio da e verso il nome del campo come di seguito

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

Dove,

"conta" = nome campo (ad esempio nome della variabile nel vostro POJO)
"0" = Range Da
"1000" = Intervallo di

Ad esempio: La query sopra preleverà dapprima 0 a 1000 come RealmResults.

Nota: la soluzione di cui sopra funziona solo se si dispone di un ID univoco con numero di righe. Nel mio caso ho inserito manualmente il valore del conteggio delle righe prima di inserire i valori in Realm.