android - 组合两个具有相同观察者类型的 LiveData 对象
问题描述
我有两个 Room 实体,它们都派生自同一个自定义基类。
@Entity
public class BaseEntity {}
@Entity
public class EntityA extends BaseEntity {
...
}
@Entity
public class EntityB extends BaseEntity {
...
}
两个派生类都有对应的 Dao 接口。
@Dao
public interface BaseDao {}
@Dao
public interface DaoA extends BaseDao {
@Query("SELECT * FROM EntityA")
public LiveData<List<EntityA>> getAll();
}
@Dao
public interface DaoB extends BaseDao {
@Query("SELECT * FROM EntityB")
public LiveData<List<EntityB>> getAll();
}
两个表中的数据足够多样化,可以分别存储,但是我的数据访问方式是一样的。因此,我想使用单个 Repository 类同时返回两个表中的条目。
public class Repository {
private List<BaseDao> daos;
private LiveData<List<BaseEntity>> entities;
public Repository(Application application) {
final EntityDatabase database = EntityDatabase.getInstance(application);
daos = new ArrayList();
daos.add(database.daoA());
daos.add(database.daoB());
entities = /** Combine entities from all daos into one LiveData object */;
}
public LiveData<List<BaseEntity>> getEntities() {
return entities;
}
}
有没有办法可以将 daoA.getAll() 和 daoB.getAll() 的结果组合成一个LiveData<List<BaseEntity>>
对象?
解决方案
我想出了一个使用 MediatorLiveData 的解决方案。
public class Repository {
private DaoA daoA;
private DaoB daoB;
public Repository(Application application) {
final EntityDatabase database = EntityDatabase.getInstance(application);
daos = new ArrayList();
daoA = database.daoA();
daoB = database.daoB();
}
public LiveData<List<BaseEntity>> getEntities() {
return mergeDataSources(
daoA.getAll(),
daoB.getAll());
}
private static LiveData<List<BaseEntity>> mergeDataSources(LiveData... sources) {
MediatorLiveData<List<BaseEntity>> mergedSources = new MediatorLiveData();
for (LiveData source : sources) {
merged.addSource(source, mergedSources::setValue);
}
return mergedSources;
}
}
推荐阅读
- ios - 从 api 获取 gif 图像并显示到 tableview 中
- javascript - 将 Konva 变换控件设置到画布顶部
- google-app-maker - 如何在应用程序制造商的 SuggestBox 中过滤选项
- redis - 如何在环回上设置redis
- gurobi - 控制台在次优终止后仍在运行
- c# - 如何连接多个列表值并生成唯一名称
- arrays - 尝试遍历数组范围内的单元格时,VBA 获得“需要对象”
- python - 从 finally 子句抛出异常
- javascript - 使用 AFrame 和 ARJs 我想在标记上增强图像。当我单击或触摸(桌面和移动)图像时,它应该导航到一个 URL
- cypress - 如何在一个会话中测试两个网站