gpt4 book ai didi

android - 使用 RxJava 2 合并 Android Room 查询的结果

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

对于我正在使用 Android Room 作为本地持久层并使用 RxJava2 来构建的应用程序,我遇到了一个我无法解决的问题。请记住,我是 RxJava 的新手。

所以我在 Room 数据库中有 2 个(或更多)实体。例如:

@Entity(tableName = "physical_tests", indices = {@Index(value = {"uuid", "day", "user_id"}, unique = true)})
public class PhysicalTest extends Task {

@ColumnInfo(name = "exercise_duration")
private long exerciseDuration;

public PhysicalTest() {
super(Type.physic, R.string.fa_icon_physical_test);
}

public long getExerciseDuration() {
return exerciseDuration;
}

public void setExerciseDuration(long exerciseDuration) {
this.exerciseDuration = exerciseDuration;
}
}

和:

@Entity(tableName = "plate_controls", indices = {@Index(value = {"uuid", "day", "user_id"}, unique = true)})
public class PlateControl extends Task {

@ColumnInfo(name = "plate_switched_on")
private boolean mPlateSwitchedOn;

public PlateControl() {
super(Type.plate, R.string.fa_icon_plate_control);
}

public boolean isPlateSwitchedOn() {
return mPlateSwitchedOn;
}

public void setPlateSwitchedOn(boolean mPlateSwitchedOn) {
this.mPlateSwitchedOn = mPlateSwitchedOn;
}
}

如您所见,两者都有一个 Task 父类(super class)。现在,如果我想创建一个查询来获取所有任务的列表(PhysicalTests+PlateControls),我将如何使用 RxJava 做到这一点?

现在我有 2 个查询返回 Maybe 在我的 Dao 中:

@Query("SELECT * FROM plate_controls")
Maybe<List<PlateControl>> getAllPlateControls();
@Query("SELECT * FROM physical_tests")
Maybe<List<PhysicalTest>> getAllPhysicalTests();

简单地合并这些似乎不起作用,因为返回类型不符合 List<Task> :

public Maybe<List<Task>> getAllTasks() {
return Maybe.merge(mTaskDao.getAllPhysicalTests(), mTaskDao.getAllPlateControls());
}

(如果这看起来有点矫枉过正,我实际上有几个 Task 的子类要合并)

最佳答案

您可以直接zip 最多 9 个源(如果通过 Iterable 源提供,则可以是任意数量的源):

public Maybe<List<Task>> getAllTasks() {
return Maybe.zip(
mTaskDao.getAllPhysicalTests(),
mTaskDao.getAllPlateControls(),
mTaskDao.getAllX(),
mTaskDao.getAllY(),
mTaskDao.getAllZ(),
(physicalTests, plateControls, xs, ys, zs) -> {
List<Task> combined = new ArrayList<>();
combined.addAll(physicalTests);
combined.addAll(plateControls);
combined.addAll(xs);
combined.addAll(ys);
combined.addAll(zs);
return combined;
}
);

关于android - 使用 RxJava 2 合并 Android Room 查询的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49030496/

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