2015-01-30 1 views
7

В таблице можно сказать 100 наименований, что является лучшим подходом для получения последних 20 объектов.Realm.io Android лучший подход для получения последних 20 предметов из таблицы

Один из способов, который я могу придумать, - загрузить все объекты, развернуть массив, создать новый массив и цикл из результатов для 20-кратного заполнения нового массива и вернуть его.

Нечто подобное следующим образом:

public ArrayList<DataObject> getLastItems (int qty){ 

    RealmResults<DataObject>results = realm.where(DataObject.class).findAll(); 

    Collections.reverse(results); 

    ArrayList<DataObject>arrayList = new ArrayList<>(); 

    for (int i = 0; i == qty; i++){ 

     arrayList.add(results.get(i)); 

    } 

    return arrayList; 
} 

Есть ли более быстрый способ сделать это в андроиде с помощью realm.io?

Update

это так далеко, как это обрабатывается ..

public ArrayList<DataObject> getLastItems (int qty){ 

    RealmResults<DataObject>results = realm.where(DataObject.class).findAll(); 
    ArrayList<DataObject> arrayList = new ArrayList<>(); 
    for (int i = results.size(); i > Math.max(results.size() - 20, 0) ; i--) { 
     arrayList.add(results.get(i-1)); 
    } 

    return arrayList; 
} 

ответ

0

Вы должны стараться избегать копирования объектов, если строго не требуется. После того, как вы сделали findAll(), у вас уже есть упорядоченный список. Затем вы можете просто использовать max (results.size() - 20, 0), чтобы узнать, какой индекс запускает вашу итерацию вместо копирования.

+0

Пожалуйста, вы можете доработать или привести пример? max в области запрашивает строку и возвращает номер –

+0

Math.max должен это сделать. Мое главное - полностью не копировать и просто ссылаться на объекты в области непосредственно с относительным индексом. Это зависит полностью от ваших потребностей и от того, как вы используете этот метод, конечно. Я в основном предлагаю не иметь этот метод, если вы можете его избежать. – bmunk

+0

спасибо за ваш вход. Мне нужно получить последние записи X, введенные в таблицу, я не могу сортировать, так как первичный ключ делится между 3-мя файлами .... я использую max сейчас ... но все же итерацию с последнего от массива до определенного количества. Я хотел избавиться от создания массива, итерации после получения всего объекта с запросом –

2

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

public ArrayList<DataObject> getLastItems (int qty){ 
    RealmResults<DataObject>results = realm.where(DataObject.class).findAll().sort("fieldName"); 
    ArrayList<DataObject> arrayList = new ArrayList<>(); 
    for (int i = Math.max(result.size() - 20, 0); i < results.size() ; i++) { 
     arrayList.add(results.get(i)); 
    } 

    return arrayList; 
} 
+0

, это все еще связано с созданием массива, повторяющего realmresults ... Я применил некоторые из вашего кода и я опубликую обновление .. спасибо –

7

Также обратите внимание, что таблицы Realm неупорядочены. Думайте о них как о мешке, в который вы помещаете свои данные. Это означает, что если вы хотите, чтобы последние 20 элементов были вставлены, вам нужно будет добавить поле, содержащее время вставки. Делать это также позволит вам достичь желаемого результата очень эффективно:

RealmResults<DataObject>results = 
    realm.where(DataObject.class) 
     .findAllSorted("timestamp", RealmResults.SORT_ORDER_DESCENDING); 

for (int i = 0; i < 20; i++) { 
    // do magic here 
} 
+0

спасибо .. Я думаю, что это лучшее решение ..не могу пойти быстрее, чем это я считаю –

+0

Нет, это почти невозможно бить, пока мы не добавим поддержку индексов для времени данных Date. – Emanuelez

6

Этот вопрос был практически закрыт, но я нашел еще один способ выяснить эту ситуацию, я не знаю, если это лучший вариант или хорошая практика, @ChristianMelchior может сказать лучше меня об этом (я видел ваше сотрудничество с проектом realm) ... ну, коды говорят больше, чем слова.

RealmResults<Appointment> appointments; 
List<Appointment> appointments = appointments.subList(0, appointments.size()); 

Как мы можем видеть, отвечая на ваш вопрос Johan, вы можете просто изменить индекс, чтобы получить все объекты, которые вы хотите!

+0

простой способ конвертировать RealmResults в список! Благодаря! – Juancho

+1

нет работа. По-прежнему возвращать список RealmResults – KingWu

+0

Хотя он возвращает List, но если вы попытаетесь изменить объекты этого списка, он все равно вызовет ошибку, так как все еще объекты realm не являются простыми объектами списка. –

0

ли как этот

Realm mRealm=Realm.getDefaultInstance(); 

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

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

  • Нет связанных вопросов^_^