【发布时间】:2020-08-21 21:19:07
【问题描述】:
考虑存储在 Room db 中的一些通用 @Entity User。一些@Dao 重新运行LiveData<List<User>> aka 'dao 结果'。我希望创建另一个 live 列表,其中每个元素都是 dao 结果的转换,比如
LiveData<List<UserWrapper>>
//UserWrapper needs a User to construct
所以我写了类似的东西
Transformations.map(daoResult,list -> {
List<UserWrapper> newList=new ArrayList<>(list.size());
list.forEach(user -> {
newList.add(new UserWrapper(user));
});
return newList;
});
如果我对 LiveData 的理解是正确的,dao 结果只响应List 级别的变化,比如列表被添加,被减去等等,而不是如果底层的 User 对象或者它的字段发生了变化。
- 这是正确的吗?
假设在 db 中进行了一些更改,这些更改使一些新记录有资格出现在底层 dao 结果的@Query的结果集中
- 查询结果
LiveData<List<User>>会自动反映这一点吗?Transformations.map会把它带到LiveData<List<UserWrapper>>吗?
在上述实现中,每次修改底层 list 时,地图都会创建一个新 List 并重新初始化它,这在我看来似乎效率低下和错误。为什么必须手动检查两个列表以确保一致的转换状态?
- 有没有更好的方法来做到这一点,使
Users 和UserWrappers 之间始终保持一对一的对应关系?
【问题讨论】:
标签: android list android-room android-livedata