kotlin 我无法使用Android Room访问单行

ercv8c1e  于 2023-05-01  发布在  Kotlin
关注(0)|答案(2)|浏览(137)

我试图创建一个活动,当你点击一个按钮它,显示所选用户的详细信息。如果我尝试显示(使用文本视图)不带参数(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。

1zmg4dgp

1zmg4dgp1#

Dao返回的livedata对象需要从Activity中观察。在ViewModel中,不返回Livedata的值,而是返回Livedata本身。

fun userById(userId: Int): Livedata<User> {
        return repo.userById(userId).asLiveData()
}

Observe this in the activity.

vm.userById(1).observe(this) { user ->
   // Update textview here
}
rjee0c15

rjee0c152#

您应该在userById查询中设置LIMIT 1。否则,它将返回所有匹配用户的列表。

@Dao
interface UserDao {

    @Query("SELECT * from user where user_id = :userId LIMIT 1")
    fun getUserById(userId: Int): Flow<User>

}

此外,看起来您没有直接使用流程。我建议你使用一个挂起函数来返回用户,而不是返回一个流。

@Dao
interface UserDao {

    @Query("SELECT * from user where user_id = :userId LIMIT 1")
    suspend fun getUserById(userId: Int): User?

}

相关问题