Страницы

Поиск по вопросам

пятница, 14 июня 2019 г.

Realm and Threading

Пишу проект. В качестве БД использую Realm. Это первый опыт с этой бд, поэтому за вопрос прошу не линчевать. Итак, к примеру, в качестве модели бд есть класс (все упрощенно, так как хочу передать суть вопроса как можно яснее):
public class QuoteText extends RealmObject { private long id; private String quoteText; ... }
Для изолирования слоя работы с этой бд я решила применить обобщенный вариант паттерна Repository. Написала интерфейс:
public interface QuoteRepository { List getListOfQuoteText(); }
И класс, реализующий этот интерфейс:
public class QuoteDataRepository implements QuoteRepository { private final Realm realm; @Override public List getListOfQuoteText() { return realm.where(QuoteText.class).findAll(); } }
Соответственно во фрагменте для получения списка QuoteText из бд:
QuoteDataRepository quoteDataRepository = new QuoteDataRepository(); List quoteTexts = quoteDataRepository.getListOfQuoteText();
Все бы ничего, но хотелось бы все эти запросы делать не в UI потоке. Как засунуть это все в другой поток? (Особенно интересно: можно ли совместить способы асинхронных запросов предлагаемые Realm (назнчаение слушателей, или запрос с использованием onSuccess(), onError() и прочее) и изоляцию слоя работы с бд).
Спасибо за помощь!
Правка: важен момент именно абстракции кода работы с бд и реализации асинхронных запросов.


Ответ

Красивее всего получится если вы будете соединять Realm + RxJava + Retrolambda.
Например вот такое может получиться:
public Observable> getFeedVkPostsSortedAsync(String field, Sort order) { return mRealm.where(VkPost.class) .equalTo(VkPost.FIELD_IS_IN_FEED, true) .equalTo(VkPost.FIELD_IS_IN_FAVORITES, true) .findAllSortedAsync(field, order) .asObservable() .filter(RealmResults::isLoaded) .filter(RealmResults::isValid) //опционально и на всякий случай отвязываем объекты от реалма и //возвращаем обычные объекты в обычном листе .flatMap(realmResults -> Observable.just(mRealm.copyFromRealm(realmResults))); }
Данный Observable, запущенный из основного потока выполнит запрос в БД асинхронно, отсеет объекты не удовлетворяющие двум условиям значений полей объектов (VkPost.FIELD_IS_IN_FEED, VkPost.FIELD_IS_IN_FAVORITES) и проверит что объекты возвращаемые полностью готовы для использования. И будет эмитить новую выборку при каждом изменении в ней.

Комментариев нет:

Отправить комментарий