单次请求单结果在房间安卓



我正在通过编写购物清单应用程序来练习我的安卓技能(初学者(。我的数据库中有两个表,一个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相对应的参考项目。

我尝试了多种方法,使用LiveDatasuspend函数、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) 
}
}
}

相关内容

  • 没有找到相关文章

最新更新