【问题标题】:Merging results of Android Room queries with RxJava 2将 Android Room 查询的结果与 RxJava 2 合并
【发布时间】:2018-02-28 13:15:15
【问题描述】:

对于我正在使用 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 超类。现在,如果我想创建一个查询来获取所有任务(PhysicalTests+PlateControls)的列表,我将如何使用 RxJava 执行此操作?

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

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

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

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

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

【问题讨论】:

  • zip它们并将两个单独的列表合并为一个新列表(即ArrayList.addAll())。
  • 嗨@akarnokd,你能给出一个如何做到这一点的代码示例吗?据我了解zip,这两个查询都需要返回一个结果才能正常工作。但可以有 2 个物理测试和 4 个板对照。在这种情况下,我的List&lt;Task&gt; list 的大小应该为 6。据我所知,这也仅适用于 2 个 Observable,而我可能想要合并 5 个或更多的结果。

标签: android rx-java2 android-room


【解决方案1】:

您可以直接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;
         }
    );

}

【讨论】:

    猜你喜欢
    • 2017-10-28
    • 1970-01-01
    • 1970-01-01
    • 2010-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多