2015-04-24 5 views
8

Как ограничить количество объектов, возвращаемых Царством? .findAll возвращает все строки, соответствующие запросу, и .findFirst возвращает только первый. Но как насчет первого 1000? .findAll может возвращать так много строк, что он потребляет слишком много памяти.Результаты Limit Realm

ответ

13

Круто, что вам не нужно беспокоиться об этом с помощью Царства. Объект результата, возвращаемый из запроса, лениво загружает объекты и свои поля при доступе к ним. Ваши объекты никогда не копируются и поэтому отображаются только один раз в памяти/диске.

Эта (реализация) деталь реализации этого объекта заключается в том, что объект RealmResults, возвращаемый из запроса, представляет собой список ссылок на соответствующие объекты. Эти ссылки - это крошечные цифры, которые хранятся сжатыми, поэтому они занимают очень мало памяти. Так что даже с 100 000 матчами на самом деле это не займет много памяти. И это займет столько же памяти для всех объектов, будь то одно поле int или сотни полей со строками или большими двоичными файлами.

0

Одним из способов может быть это, если вы действительно хотите только RealmResults, используя Streamlimit метод:

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

Не забудьте пересчитать их в 'entity''s RealmChangeListener – EpicPandaForce

0

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

1

Я вычислил решение для достижения этого после стольких дней, используя запрос «между», как это указано в официальных документах. https://realm.io/docs/java/latest

Если вы хотите получить первые N элементов, просто передайте счет с и с именем поля

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

Где

"считать" = имя поля (т.е. имя переменной в вашем POJO)
"0" = Диапазон От
"1000" = Диапазон для

Например: Приведенный выше запрос будет получать первые 0 до 1000, как RealmResults.

Примечание. Вышеупомянутое решение работает только в том случае, если у вас есть уникальный идентификатор с количеством строк. В моем случае я вручную вставил значение счетчика строк, прежде чем вставлять значения в Realm.

Смежные вопросы