gpt4 book ai didi

android - 组合两个具有相同观察者类型的 LiveData 对象

转载 作者:行者123 更新时间:2023-11-30 05:11:39 25 4
gpt4 key购买 nike

我有两个 Room 实体,它们都派生自相同的自定义基类。

@Entity
public class BaseEntity {}

@Entity
public class EntityA extends BaseEntity {
...
}

@Entity
public class EntityB extends BaseEntity {
...
}

两个派生类都有相应的 Dao 接口(interface)。

@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;
}
}

关于android - 组合两个具有相同观察者类型的 LiveData 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53621531/

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