2015-04-24 15 views
8

Jak ograniczyć ilość zwrotów Realm przedmiotów? .findAll zwraca wszystkie wiersze pasujące do zapytania, a .findFirst zwraca tylko pierwszą. Ale co z czymś podobnym do pierwszego 1000? .findAll może zwrócić tak wiele wierszy, że zużywa zbyt dużo pamięci.Limit Realm wyniki

Odpowiedz

13

Fajną rzeczą jest to, że nie musisz martwić się tym w Królestwie. Obiekt wynikowy zwracany z zapytania jest leniwie ładowany do obiektów i ich pól podczas uzyskiwania do nich dostępu. Twoje obiekty nigdy nie są kopiowane, a zatem reprezentowane tylko raz w pamięci/na dysku.

(Obecny) szczegół implementacji tego jest taki, że obiekt RealmResults zwrócony z zapytania jest po prostu listą odniesień do pasujących obiektów. Te referencje to małe liczby, które są przechowywane w skompresowanej formie, więc zajmują bardzo mało pamięci. Tak więc nawet przy 100 000 meczach nie zajmowałoby to dużo pamięci. I wymagałoby to tej samej ilości pamięci dla wszystkich rodzajów obiektów, bez względu na to, czy mają one jedno pole int, czy setki pól z łańcuchami lub dużymi binariami.

0

Jednym ze sposobów może być to, jeśli naprawdę chcesz tylko RealmResults korzystając Streamlimit metoda:

//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

Nie zapomnij o ponownym przeliczeniu ich w RealmChangeListener 'entity's – EpicPandaForce

0

Realm obecnie nie zapewniają żadnej funkcji granicznej, ale jeśli chcesz pierwsze elementy N

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

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

dla ostatnich elementów N

1

Udało mi się znaleźć rozwiązanie, aby to osiągnąć po tylu dniach, używając zapytania "między" znalezionego w oficjalnym dokumencie. Jeśli chcesz pobrać pierwsze N ​​elementów, Po prostu podaj liczbę od i do z nazwą pola, jak poniżej.

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

Gdzie,

"liczyć" = nazwa pola (czyli nazwę zmiennej w POJO)
"0" = Zakres Od
"1000" = Range na

Na przykład: Powyższe zapytanie pobiera pierwszą 0 do 1000, jak RealmResults.

Uwaga: powyższe rozwiązanie działa tylko w przypadku posiadania unikalnego identyfikatora z liczbą wierszy. W moim przypadku ręcznie wstawiłem wartość liczby wierszy przed wstawieniem wartości do dziedziny.