【问题标题】:Android LiveData - Object value is not updatedAndroid LiveData - 对象值未更新
【发布时间】:2021-03-01 04:53:55
【问题描述】:

我使用 Kotlin Flow 和 LiveData 从房间数据库中获取对象。我想知道数据库中对象的值发生了变化。我做了以下事情;

UserDao

@Query("SELECT * FROM user WHERE id=:userId")
fun getUserById(userId: String?) : Flow<User>

用户存储库

fun getUserById(userId: String?) : Flow<User> = userDao.getUserById(userId);

视图模型

val userId = MutableStateFlow<String>("")

val user : LiveData<User> = userId.flatMapLatest { id ->
    userRepository.getUserById(id)
}.asLiveData()

获取数据时没有问题,但是当我更改用户名时,“user.name”值没有更新。

注意:更改数据库,检查。

我将名称更新如下:

@Query("UPDATE user SET name = :name WHERE id = :userId")
suspend fun updateName(name: String, userId: String)

【问题讨论】:

  • 能否提供更新名称的代码?
  • @SamiShorman 你能检查我的更新吗?
  • 以及您如何从 ui 调用 updateName(),以及为什么您不在房间中使用 @Update 注释并将新的用户对象传递给函数,我将作为答案提交,也许它会有所帮助。
  • @MuratAKSU 在更新数据库时您是否 ping userId 对象。否则我认为upstream 不会被触发并将数据传递给downstream。我不明白这里的流程。

标签: java android kotlin android-livedata kotlin-flow


【解决方案1】:

你可以用它来实现你想要的:

在多阿:

@Update
suspend fun updateUser(user:User)

在用户界面中:

user.name = newName
updateUser(user)

我知道这不是你想要的方式,但它可以给你同样的行为,谢谢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-17
    • 2018-06-09
    相关资源
    最近更新 更多