我正在通过编写购物清单应用程序来练习我的安卓技能(初学者(。我的数据库中有两个表,一个shopping_item
表(我想购买的项目(和一个reference_item
表(我知道的类别和单价的项目(。每次添加购物商品时,都有一个引用参考商品 id 的refId
字段。如果尚未引用购物项目,则它是默认引用项目的默认值。
我使用 MVVM 模型。然后我有一个DAO
,一个repository
,一个viewModel
和我的fragments
显示数据。
当我添加新的购物项目时,我想知道是否有相应的参考项目。我想做以下Query
:
@Query(value = "SELECT refId FROM reference_items WHERE reference_item_name = :refName")
suspend fun getRefItem(refName : String) : Int
它返回对应于 Int 的引用项的 id,如果尚未引用,则为 null。在我的存储库中,我有一个这样的函数:
suspend fun getRefItem(refName : String) = db.getShoppingDao().getRefItem(refName)
就目前而言,我认为我做得很好。我猜没有错。
当我尝试实现我的viewModel
时,问题就开始了。我该怎么办?我的fragment
呢?
我的fragment
中有一个addNewItem(name: String, amount: Int)
函数来添加新项目。我可以找到与提供的name
相对应的参考项目。
我尝试了多种方法,使用LiveData
、suspend
函数、mutableLiveData
/LiveData
,但我现在迷路了。每个教程或示例都使用LiveData
或查询数据库中的所有数据。我只想要一个Integer
,一次,我认为不需要LiveData
。
这里是完整的解决方案。希望这对你有用。
道
@Query(value = "SELECT refId FROM reference_items WHERE reference_item_name = :refName")
suspend fun getRefItem(refName : String) : Int
存储 库
// Specify return datatype as Int
suspend fun getRefItem(refName : String): Int = db.getShoppingDao().getRefItem(refName)
视图模型
fun getRefItem(name: String): LiveData<Int> {
val result : MutableLiveData<Int>() <-- setup livedata to return as value
viewModelScope.lanuch {
result.postValue(repository.getRefItem(name))
}
return result <-- return livedata
}
片段
fun addNewItem(name: String, amount: Int) {
// setup viewModel observer
viewModel.getRefItem(name).observer { viewLifecycleOwner, { value ->
// GET YOUR INT VALUE HERE
Log.i("VALUE", value)
}
}
}