Android 使用协程api获取实体
使用Android 使用协程api获取实体,android,kotlin,android-livedata,kotlin-coroutines,Android,Kotlin,Android Livedata,Kotlin Coroutines,使用coroutines和LiveData从数据库中使用Room选择一些数据的最佳方法是什么 这是我暂停选择的刀类 @Dao interface UserDao { @Query("SELECT * from user_table WHERE id =:id") suspend fun getUser(id: Long): User } 视图模型类I的内部使用viewModelScope加载用户 获取用户实体的方法正确吗? fun load(userId: Long, blo
coroutines
和LiveData从数据库中使用Room
选择一些数据的最佳方法是什么
这是我暂停选择的刀类
@Dao
interface UserDao {
@Query("SELECT * from user_table WHERE id =:id")
suspend fun getUser(id: Long): User
}
视图模型类I的内部使用viewModelScope
加载用户
获取用户实体的方法正确吗?
fun load(userId: Long, block: (User?) -> Unit) = viewModelScope.launch {
block(database.load(userId))
}
根据提到的
val user: LiveData<User> = liveData {
val data = database.loadUser() // loadUser is a suspend function.
emit(data)
}
val用户:LiveData=LiveData{
val data=database.loadUser()//loadUser是一个挂起函数。
发射(数据)
}
这段代码不起作用您的房间必须返回LiveData 改用:
@Dao
interface UserDao {
@Query("SELECT * from user_table WHERE id =:id")
fun getUser(id: Long): LiveData<User>
}
@Dao
接口用户DAO{
@查询(“从用户_表中选择*,其中id=:id”)
fun getUser(id:Long):LiveData
}
请说明它是如何工作的。您发布的函数是否为您的数据库.loadUser()版本?您的不是挂起函数,也不返回用户(它返回协同例程作业)。当我为单个项设置返回类型LiveData时,room无法编译项目。没有足够的信息来调试它。我不知道你说的是哪个函数,你是如何使用它的。您问题中的代码与函数名或返回类型不匹配。我已更新了我的问题。请再次检查@Tenfour04I仍然看不到您如何调用此load
函数。如果它返回LiveData
,则它不应该是suspend
您正在编写的。当我删除suspend关键字代码时,successRoom支持suspend函数。另外,LiveData
不是必需的返回类型。您可以选择使用LiveData或协同程序。但是,对于不同的提议,livedata将观察Room上的更改,协同程序将从DB获取数据,而不会阻塞UI线程。我理解这些差异。我想指出的是,OP希望使用不要求返回类型为LiveData的挂起函数。我相信还有其他事情在进行,将返回类型更改为LiveData可能不是解决方案。