Я пытаюсь реализовать этот подход к шаблону репозитория с использованием Rx & Room. У меня есть API для поиска категорий:
interface CategoryApi {
@GET("/categorytags")
fun getCategories(): Single<List<CategoryTagHolder>>
}
Это мой репозиторий:
class CategoryRepositoryImpl(private val categoryDao: CategoryDao,
private val categoryApi: CategoryApi,
private val scheduleProvider: SchedulerProvider, loginRepository: LoginRepository) : AuthRepository(loginRepository), CategoryRepository {
override fun getCategories(): Flowable<List<Category>> {
return Flowable.concatArray(
categoryDao.getCategories().doOnNext {
Timber.w("Retrieving Categories from Local DB!")
},
getCategoriesFromRemote().doOnNext {
Timber.w("Retrieving Categories from API!")
}
}
private fun getCategoriesFromRemote() =
fromFlowable(categoryApi.getCategories().toFlowable())
.flatMap {
if (it.isNotEmpty()) {
Flowable.just(it[0].categories)
} else {
Flowable.just(listOf())
}
}
.doOnNext {
saveCategoriesInDb(it)
}
}
А это мой DAO:
@Dao
interface CategoryDao {
@Query("select * from category")
fun getCategories(): Flowable<List<Category>>
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun saveAllCategories(categories: List<Category>)
}
Независимо от того, как я это делаю, я всегда получаю пустой список, потому что при инициализации моя БД пуста! В логах отображается только "Retrieving Categories from Local DB!"
. Если я поменяю местным и удаленным вызовом, то будут показаны обе строки журнала, но это противоречит цели этого подхода.
Что я могу делать не так?
Это модель представления:
fun getFilters() {
categoryRepository.getCategories()
.subscribeOn(schedulerProvider.io())
.observeOn(schedulerProvider.ui())
.subscribeBy(onNext = {
Timber.e("Got cat list $it")
categories.value = Result.success(it)
},
onError = {
Timber.e("ERROR ${it.message}")
}).addTo(disposables)
}
Ошибка не отображается.