Android Kotlin Room 数据库。从 ViewModel 调用时查询失败。通过 App Inspection window
Android Kotlin Room database. Query fails when called from ViewModel. Passes from App Inspection window
我有一个使用片段、导航和视图模型的应用程序。我无法从我的视图模型 (CustomerViewModel.kt) 调用查询“getCustomerById”。
更多细节:
我正在从打开 CustomerDetailFragment 并显示有关客户的详细信息的 CustomerFragment 中选择客户。我为这两个片段使用了一个通用的 ViewModel。大多数事情都有效,但我无法让我的查询 (getCustmoerbyID) 从 CustomerDetailsFragment 开始工作。我有一个编译器错误。
代码如下所示。
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val customer = customerViewModel.geCustomerById("11")
Log.i(Constants.LOG_TAG, "Customer details fragment. ${customer.first().firstName}. Done ** onViewCreated. **")
}
错误在日志语句中,针对方法 first()。 “挂起函数 'first' 只能从协程或另一个挂起函数中调用”
“getCustomerCount”存在同样的问题。由于我对协同程序缺乏了解,我花了几个小时或几天的时间。我无法从原始应用程序中添加代码,因此我在 github 上添加了一个简化的应用程序。 link 如下。
https://github.com/msyusuf。 ViewModel 是 CustomerViewModel。查询是
fun geCustomerById(cust_id: String) : Flow<Customer> { return repository.geCustomerById(cust_id) }
其他 类 是 CustomerDao.kt、CustomerRepository.kt、CustomerFragment、CustomerDetailsFragment.kt。
您需要启动协程来调用 suspend
函数 Flow.first()
。在 Activity
或 Fragment
中,您可以使用 lifecycleScope
, in ViewModel - viewModelScope
启动协程。示例:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
lifecycleScope.launch {
val customer = customerViewModel.geCustomerById("11")
val name = customer.first()?.firstName;
// ... use name
}
}
我有一个使用片段、导航和视图模型的应用程序。我无法从我的视图模型 (CustomerViewModel.kt) 调用查询“getCustomerById”。 更多细节: 我正在从打开 CustomerDetailFragment 并显示有关客户的详细信息的 CustomerFragment 中选择客户。我为这两个片段使用了一个通用的 ViewModel。大多数事情都有效,但我无法让我的查询 (getCustmoerbyID) 从 CustomerDetailsFragment 开始工作。我有一个编译器错误。 代码如下所示。
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val customer = customerViewModel.geCustomerById("11")
Log.i(Constants.LOG_TAG, "Customer details fragment. ${customer.first().firstName}. Done ** onViewCreated. **")
}
错误在日志语句中,针对方法 first()。 “挂起函数 'first' 只能从协程或另一个挂起函数中调用”
“getCustomerCount”存在同样的问题。由于我对协同程序缺乏了解,我花了几个小时或几天的时间。我无法从原始应用程序中添加代码,因此我在 github 上添加了一个简化的应用程序。 link 如下。 https://github.com/msyusuf。 ViewModel 是 CustomerViewModel。查询是
fun geCustomerById(cust_id: String) : Flow<Customer> { return repository.geCustomerById(cust_id) }
其他 类 是 CustomerDao.kt、CustomerRepository.kt、CustomerFragment、CustomerDetailsFragment.kt。
您需要启动协程来调用 suspend
函数 Flow.first()
。在 Activity
或 Fragment
中,您可以使用 lifecycleScope
, in ViewModel - viewModelScope
启动协程。示例:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
lifecycleScope.launch {
val customer = customerViewModel.geCustomerById("11")
val name = customer.first()?.firstName;
// ... use name
}
}