Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将Android Room查询结果与RxJava 2合并_Android_Rx Java2_Android Room - Fatal编程技术网

将Android Room查询结果与RxJava 2合并

将Android Room查询结果与RxJava 2合并,android,rx-java2,android-room,Android,Rx Java2,Android Room,对于一个应用程序,我正在使用Android Room构建本地持久层,使用RxJava2构建令人惊叹的应用程序,我遇到了一个我无法理解的问题。 请记住,我是RxJava的新手 所以我在一个房间数据库中有2个(或更多)实体。例如: @Entity(tableName = "physical_tests", indices = {@Index(value = {"uuid", "day", "user_id"}, unique = true)}) public class PhysicalTest e

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

所以我在一个房间数据库中有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;
    }
}
以及:

如您所见,两者都有一个任务超类。现在,如果我想创建一个查询来获取所有任务的列表(PhysicalTests+PlateControls),那么我应该如何使用RxJava来实现这一点呢

现在我有两个查询,返回的可能在我的Dao中:

@Query("SELECT * FROM plate_controls")
Maybe<List<PlateControl>> getAllPlateControls();
@Query("SELECT * FROM physical_tests")
Maybe<List<PhysicalTest>> getAllPhysicalTests();
@Query(“从板控件中选择*)
可能是getAllPlateControls();
@查询(“从物理测试中选择*)
也许可以获取所有物理测试();
简单地合并它们似乎不起作用,因为返回类型不符合
列表

public-getAllTasks(){
返回Maybe.merge(mTaskDao.getAllPhysicalTests(),mTaskDao.getAllPlateControls());
}

(如果这看起来有些过分,我实际上有几个任务的子类要合并)

您可以直接
zip
多达9个源(或任何数量的源,如果通过
Iterable
源提供):

public-getAllTasks(){
返回Maybe.zip(
mTaskDao.getAllPhysicalTests(),
mTaskDao.getAllPlateControls(),
mTaskDao.getAllX(),
mTaskDao.getAllY(),
mTaskDao.getAllZ(),
(物理测试、平板控制、xs、ys、zs)->{
组合列表=新的ArrayList();
合并。添加全部(物理测试);
合并。添加全部(平板控制);
合并后的.addAll(xs);
综合。综合(ys);
合并。添加所有(zs);
综合收益;
}
);

}

zip
将两个单独的列表合并成一个新列表(即
ArrayList.addAll()
)。您好@akarnokd,您能给出一个代码示例说明如何执行此操作吗?根据我对
zip
的理解,两个查询都需要返回一个结果才能正常工作。但是可以有2个物理测试和4个平板对照。在这种情况下,我的
列表的大小应为6。据我所知,这也只适用于2个观测值,而我可能希望合并5个或更多观测值的结果。
@Query("SELECT * FROM plate_controls")
Maybe<List<PlateControl>> getAllPlateControls();
@Query("SELECT * FROM physical_tests")
Maybe<List<PhysicalTest>> getAllPhysicalTests();
public Maybe<List<Task>> getAllTasks() {
        return Maybe.merge(mTaskDao.getAllPhysicalTests(), mTaskDao.getAllPlateControls());
}
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;
         }
    );