Room + LiveData动态更改查询功能

时间:2019-02-04 17:30:39

标签: kotlin android-room android-architecture-components android-livedata

我正在制作一个应更新当前列表的应用程序。实现是使用room和livedata完成的,即使用不带viewmodel的mvp模式。我的问题是,如果我有一个查询,该查询返回了选定类别中的所有项目,并且我在实时数据上已有一个可观察的对象,我可以使用不同的查询参数更改dao函数,并相应地更新列表。我发现最接近的是: Android Room LiveData select query parameters

但是,由于我对开发相对较新,并且目前正在探索android中的反应式范例,因此这被证明是一个很大的挑战。

在演示者中

override var itemsList: LiveData<List<Item>?> = 
itemDao.getItemsForCategory(1)

in mainAcivity

presenter.itemsList.observe(this, Observer {
    if (it != null) {
        itemAdapter.setTodoItems(it)
        itemListHolder.adapter =itemAdapter
    }
})

在岛

@Query("SELECT * FROM Item")
fun getItemsFromDatabase(): LiveData<List<Item>?>

@Query("SELECT * FROM Item WHERE category_id == :category_id ORDER BY 
creationTime ASC")
fun getItemsForCategory(category_id: Long): LiveData<List<Item>?>

编辑(解决方案)

解决方案是mutableLiveData,其中该值更改了查询参数:

override var itemsList: LiveData<List<IItem>?> = Transformations.switchMap(mutableLiveData) {
    itemDao.getItemsForCategory(mutableLiveData.value!!.toLong())
}

override fun onItemsCalled(categoryId: Long) {
    when (mutableLiveData.value) {
        1 -> mutableLiveData.value = 2
        2 -> mutableLiveData.value = 3
        3 -> mutableLiveData.value = 4
        4 -> mutableLiveData.value = 1
    }
}

这只是对同一类别的查询,但处理方式不同,一切皆有可能。

1 个答案:

答案 0 :(得分:1)

编辑(解决方案)

解决方案是mutableLiveData,其中该值更改了查询参数:

override var itemsList: LiveData<List<IItem>?> = Transformations.switchMap(mutableLiveData) {
itemDao.getItemsForCategory(mutableLiveData.value!!.toLong())
}

override fun onItemsCalled(categoryId: Long) {
    when (mutableLiveData.value) {
        1 -> mutableLiveData.value = 2
        2 -> mutableLiveData.value = 3
        3 -> mutableLiveData.value = 4
        4 -> mutableLiveData.value = 1
    }
}