【发布时间】: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