【发布时间】:2019-10-11 12:40:55
【问题描述】:
我正在使用带有 Room 数据库的 PagedList 架构组件,我无法将结果返回到观察方法。
这是我的道:
@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 错了?为什么不调用观察?
【问题讨论】:
-
没有理由在 IO 上下文中获取分页列表数据源工厂。
-
@EpicPandaForce 不确定你的意思?
标签: android datasource android-architecture-components android-livedata pagedlist