我试图创建一个活动,当你点击一个按钮它,显示所选用户的详细信息。如果我尝试显示(使用文本视图)不带参数(UserDao中的getAllUsers)的查询结果,它可以工作。带有硬编码参数的查询不会(使用的代码将插入EditText,这只是一个测试)
活动
findViewById<Button>(R.id.getButton).setOnClickListener() {
val user = vm.userById(1)
if(user!= null) {
findViewById<TextView>(R.id.myText).text = user.name
}
else {
findViewById<TextView>(R.id.myText).text = "User not found"
}
}
视图模型
class TestViewModel(private val repo: UserRepository) : ViewModel() {
fun userById(userId: Int): User? {
val user = repo.userById(userId).asLiveData()
return user.value
}
val users: LiveData<List<User>> = repo.users.asLiveData()
}
资料库
class UserRepository(private val userDao: UserDao) {
fun userById(userId: Int): Flow<User> {
return userDao.getUserById(userId)
}
val users: Flow<List<User>> = userDao.getAllUsers()
}
UserDao
@Dao
interface UserDao {
@Query("SELECT * from user where user_id = :userId")
fun getUserById(userId: Int): Flow<User>
@Query("SELECT * from user")
fun getAllUsers(): Flow<List<User>>
}
我搜索了其他指南和教程,当然还有官方文档,但我无法理解返回值为null。
2条答案
按热度按时间1zmg4dgp1#
Dao返回的livedata对象需要从Activity中观察。在ViewModel中,不返回Livedata的值,而是返回Livedata本身。
rjee0c152#
您应该在
userById
查询中设置LIMIT 1
。否则,它将返回所有匹配用户的列表。此外,看起来您没有直接使用流程。我建议你使用一个挂起函数来返回用户,而不是返回一个流。