robert_n
@robert_n
Middle Android Developer

Как правильно сделать запрос на rxJava?

У меня есть 3 таблицы: Article, User и Category. В таблице Article хранятся все статьи, в User - пользователи приложения, и Category - категории статей. Структура таблицы Article
title-> String
content-> String
category -> Category.id
autor ->User.id


Мне необходимо получить все статьи, а также информацию о том, к какой категории она принадлежит и об авторе данной статьи. Все эти данные находятся в локальной БД и должны быть отображены в recyclerView.

Я написал 3 метода, которые извлекают данные из локальной БД и возвращают Observable:
public Observable<List<Article>> getArticles() {
        return articleSqlRepository.query(new articlesAllSpecification());
    }


 public Observable<User> geUser(String userId) {
// Получить информацию об авторе статьи, используя его id                
        return userSqlRepository.query(new UserByIdSpecification(userId)); 

    }

 public Observable<Category> getCategory(String categoryId) {
// Получить информацию о категории
        return categorySqlRepository.query(new CategoryByIdSpecification(categoryId)); 

    }


Далее я вызываю метод, который должен вернуть список статей List. Но столкнулся с проблемой, что не знаю как правильно объединить запросы. Дело в том что я сначала должен получить список всех статей, а потом для каждой конкретной статьи найти информацию о ее категории и авторе.
public void getArticleItems()
{
// Список статей, для отображения в RecyclerView
List<ArticleItem> articleItemLists = new ArrayList<>();
// Получить список всех статей
getArticles()
// Последовательно обработать все статьи
   .flatMap(Observable::from)
// Что делать дальше?
}


И вот проблема: какой оператор использовать чтобы объединить 2 Observable (getUser() и getCategory()) чтобы можно было обратиться к объекту article из предыдущего результата запроса.
  • Вопрос задан
  • 729 просмотров
Решения вопроса 1
zagayevskiy
@zagayevskiy Куратор тега Java
Android developer at Yandex
Дальше ваш нужен
.switchMap(article -> Observable.zip(
    getUser(...).first(), 
    getCategory(...).first(),
     (user, category) -> { return new ArticleItem(...); })
.toList()
.subscribe(listOfArticleItems -> ...);

по всем операторам почитайте документацию, станет понятнее.
Кстати, для работы с БД удобно использовать реактивную обёртку StorIO, а не городить свои костыли.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Tiberal
все зависит от того как надо их объединить. выбирайте ваш случай.

https://github.com/ReactiveX/RxJava/wiki/Combining...

на первый взгляд вам zip нужен
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
ЭЛКОМ+ Санкт-Петербург
от 80 000 до 110 000 руб.
АКМЭ сервис Санкт-Петербург
от 80 000 до 110 000 руб.
iGooods.ru Санкт-Петербург
от 150 000 руб.