@Lordao

Каким образом вернуть измененный список из БД с помощью rxjava?

Есть метод, который возвращает данные в видеFlowable<MutableList<Item>>. МетодitemDao.getAllItems() выдаёт список в видеFlowable<MutableList<ItemEntity>> из БД. Для конвертация объекта из ItemEntity в Item использую свой класс Mapper с помощью метода mapDetailItem, куда кидаю список деталей из другой таблицы, которые затем будут добавлены в объект Item, а затем будет возвращен сам объект, у которого уже есть заполненное поле List<DetailItem>.

Каким образом можно это провернуть с каждым элементом и в итоге вернуть списокMutableList<Item> вместо MutableList<ItemEntity>

override fun loadLocalItems(): Flowable<MutableList<Item>> {
        return itemDao.getAllItems()
                .map { list ->
                    Flowable.fromIterable(list).map {
                        mapper.mapDetailItem(it, itemDao.getAllDetailItemsById(it.idItem))
                    }
                }
 }


C одним элементом я делаю таким образом
return itemDao.getItemById(id).map { mapper.mapDetailItem(it, itemDao.getAllDetailItemsById(it.idItem)) }
  • Вопрос задан
  • 123 просмотра
Решения вопроса 1
zagayevskiy
@zagayevskiy Куратор тега Android
Android developer at Yandex
1) Все rx-интерфейсы должны возвращать List, а не MutableList! Это как постулат. Данные внутри rx должны быть иммутабельны!
2) вместо map {Floawable.fromIterable(it)} можно использовать flatMapIterable
3) getAllDetailItemsById должен тоже возвращать поток. Почему в мапе хождение в БД? работать с этим так
.flatMapIterable { 
    itemDao.allDetailItemsById(it.idItem)
       .map { data ->  mapper.mapDetailItem(it, data) }
}

4) "которые затем будут добавлены в объект Item, а затем будет возвращен сам объект, у которого уже есть заполненное поле List" - смотри пункт 1). Item должен быть иммутабелен! Если в него надо что-то добавлять, то data class + copy(something = 123)
5) преобразовать стрим в список можно простым методом toList()
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы