Пишу проект. В качестве БД использую Realm. Это первый опыт с этой бд, поэтому за вопрос прошу не линчевать.
Итак, к примеру, в качестве модели бд есть класс (все упрощенно, так как хочу передать суть вопроса как можно яснее):
public class QuoteText extends RealmObject {
private long id;
private String quoteText;
...
}
Для изолирования слоя работы с этой бд я решила применить обобщенный вариант паттерна Repository. Написала интерфейс:
public interface QuoteRepository {
List
И класс, реализующий этот интерфейс:
public class QuoteDataRepository implements QuoteRepository {
private final Realm realm;
@Override
public List
Соответственно во фрагменте для получения списка QuoteText из бд:
QuoteDataRepository quoteDataRepository = new QuoteDataRepository();
List
Все бы ничего, но хотелось бы все эти запросы делать не в 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) и проверит что объекты возвращаемые полностью готовы для использования. И будет эмитить новую выборку при каждом изменении в ней.
Комментариев нет:
Отправить комментарий