【问题标题】:Why does livedata return stale data from Room为什么 livedata 从 Room 返回陈旧数据
【发布时间】:2020-06-23 18:44:18
【问题描述】:

我遇到了一个问题,如果不实施脆弱的 hack,我将无法解决。

我有一个用户表。

我正在通过 LiveData 观察它。

每次我在该表上启动更新时,我的观察者都会调用两次。一次使用旧值,然后使用新更新的值。

为了说明问题,我创建了一个小示例,我将在下面分享

UserDao.kt

   @Dao
    interface UserDao {

        //region Inserts
        @Insert(onConflict = OnConflictStrategy.REPLACE)
        fun insertUser(user: User)
        @Update
        fun update(user:User)
@Query("select * from users ")
    fun users(): LiveData<List<User>>

}

我在 MainActivity 中观察实时数据。

  observe(
            database.usersDao().users()
        ){
            Log.d("Here",it.name) // i first get the previous val then the new one
        }

这也是我在 MainActivity 中注册更新的方式

GlobalScope.launch {


            database.usersDao().update(
                User(
                    102,
                    "John",
                    "asdas",
                    roleCsv = "aaa",
                    accessToken = AccessToken("asd", "asd", 0),
                    loggedIn = false
                )
            )

        }

这里发生的事情对我的系统来说是灾难性的。

我得到一个有以前名字的用户对象,然后我得到更新的“约翰”

observe只是一个扩展方法,方便注册观察者

fun <T : Any, L : LiveData<T>> LifecycleOwner.observe(liveData: L, body: (T) -> Unit) =
        liveData.observe(this, Observer(body))

我的问题是这是设计使然吗?我可以做一些事情,只有数据库中的最终图片调用我的观察者吗?

【问题讨论】:

    标签: android android-room android-livedata android-jetpack


    【解决方案1】:

    我建议在您的情况下观察以下 liveData:

    Transformations.distinctUntilChanged(database.usersDao().users())
    

    来源: https://developer.android.com/reference/androidx/lifecycle/Transformations.html#distinctUntilChanged(androidx.lifecycle.LiveData%3CX%3E)

    另一方面,将 liveData 引用保存在 androidx 的 viewModel 中。

    【讨论】:

      猜你喜欢
      • 2023-03-04
      • 2019-01-24
      • 1970-01-01
      • 2021-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-07
      相关资源
      最近更新 更多