gpt4 book ai didi

android - Room : LiveData from Dao will trigger Observer. onChanged 每次更新,即使 LiveData 值没有变化

转载 作者:IT老高 更新时间:2023-10-28 23:34:31 29 4
gpt4 key购买 nike

我发现,只要 DB 中的行更新,Dao 返回的 LiveData 就会调用它的观察者,即使 LiveData 的值显然没有改变。

考虑类似以下示例的情况:

示例实体

@Entity
public class User {
public long id;
public String name;
// example for other variables
public Date lastActiveDateTime;
}

示例道

@Dao
public interface UserDao {
// I am only interested in the user name
@Query("SELECT name From User")
LiveData<List<String>> getAllNamesOfUser();

@Update(onConflict = OnConflictStrategy.REPLACE)
void updateUser(User user);
}

后台线程中的某处

UserDao userDao = //.... getting the dao
User user = // obtain from dao....
user.lastActiveDateTime = new Date(); // no change to user.name
userDao.updateUser(user);

用户界面中的某处

// omitted ViewModel for simplicity
userDao.getAllNamesOfUser().observe(this, new Observer<List<String>> {
@Override
public void onChanged(@Nullable List<String> userNames) {
// this will be called whenever the background thread called updateUser.
// If user.name is not changed, it will be called with userNames
// with the same value again and again when lastActiveDateTime changed.
}
});

在这个例子中,用户界面只对用户名感兴趣,因此 LiveData 的查询只包括名称字段。然而即使只更新了其他字段,仍会在 Dao Update 上调用observer.onChanged。(其实如果我不对User实体做任何改动,调用UserDao.updateUser,observer.onChanged还是会被调用)

这是 Dao LiveData in Room 的设计行为吗?是否有机会解决这个问题,以便仅在更新所选字段时调用观察者?


编辑:我更改为使用以下查询将 lastActiveDateTime 值更新为评论建议中的 KuLdip PaTel。用户名的 LiveData 的观察者仍然被调用。

@Query("UPDATE User set lastActiveDateTime = :lastActiveDateTime where id = :id")
void updateLastActiveDateTime(Date lastActiveDateTime, int id);

最佳答案

Transformations方法distinctUntilChanged有一个简单的解决方案。仅当数据发生更改时才公开新数据。

在这种情况下,我们仅在源发生更改时才获取数据:

LiveData<YourType> getData(){
return Transformations.distinctUntilChanged(LiveData<YourType> source));
}

但是对于事件情况最好使用这个: https://stackoverflow.com/a/55212795/9381524

关于android - Room : LiveData from Dao will trigger Observer. onChanged 每次更新,即使 LiveData 值没有变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47215666/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com