Я использую архитектурные компоненты PagedList, используя базу данных Room, и у меня возникают проблемы с возвратом результатов в метод наблюдения.
Вот мой Дао:
@Dao
interface WorkPackageStorageDao {
@Query("SELECT * from workpackages where id = :id")
fun getById(id: String): Workpackage
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insert(workpackage: Workpackage)
@Query("Select * from workpackages WHERE id LIKE '%' || :searchString || '%' order by :orderBy")
fun searchWorkpackages(searchString : String, orderBy : String) : DataSource.Factory<Int, Workpackage>
@Query("SELECT * FROM workpackages")
fun searchWorkPackgesTest() : List<Workpackage>
@Query("Select * from workpackages WHERE id LIKE '%' || :searchString || '%' order by :orderBy")
fun searchWorkPackgesTestQuery(searchString : String, orderBy : String) : List<Workpackage>
@Query("DELETE from workpackages")
fun deleteAll()
}
Мой репозиторий:
fun getAllWorkPackagesTestQuery() : List<Workpackage> {
return workpackagesDao.searchWorkPackgesTestQuery("",SortedBy.WorkPackageNumber.type)
}
fun getAllWorkPackages() : DataSource.Factory<Int, Workpackage> {
return getSortedAndSearchedWorkPackages("",
SortedBy.WorkPackageNumber
)
}
fun getSortedAndSearchedWorkPackages(searchString : String, sortBy: SortedBy) : DataSource.Factory<Int, Workpackage> {
return workpackagesDao.searchWorkpackages(searchString,sortBy.type)
}
ВотМетод в моей модели представления:
suspend fun fetchWorkPackagesInitial(
workWeek: Configurations.AppWeek,
pagingLimit: Int
) {
coroutineScope {
withContext(Dispatchers.IO) {
val factory: DataSource.Factory<Int, Workpackage> =
workPackageRepository.getAllWorkPackages()
val pagedListBuilder =
LivePagedListBuilder<Int, Workpackage>(factory, pagingLimit)
workPackagesList = pagedListBuilder.build()
val list = workPackageRepository.getAllWorkPackagesTestQuery() //27 Items returned, query is fine.
}
}
}
Вот мой фрагмент:
mainViewModel.week.observe(this, Observer {
it ?: return@Observer
launch { workPackagesViewModel.fetchWorkPackagesInitial(it, PAGING_LIMIT) }
})
//Observe never called.
workPackagesViewModel.workPackagesList?.observe(this, Observer { wpList ->
wpList ?: return@Observer
adapter = WorkPackagesRecyclerAdapter(this)
adapter.submitList(wpList)
binding.workPackagesRecyclerView.adapter = adapter
adapter.notifyDataSetChanged()
})
В качестве теста для моего запроса я реализовал:
val list = workPackageRepository.getAllWorkPackagesTestQuery()
, который возвращает 27 элементов, так что запрос в порядке. Я неправильно настраиваю Dao, неправильный LivePagedListBuilder? Почему наблюдение не называется?