几个不同房间查询的策略

Tactic for several different Room queries

在重构应用程序时,我决定使用空间(和其他架构组件)。一切顺利,直到我到达异步的数据库查询。我没问题,我可以使用 LiveData 回调更新视图。

但是随着较小的查询相互跟随出现了问题 - 没有线程限制很容易,您可以直接使用变量。

在遗留代码中有很多设置,其中需要大量来自不同 table 的小数据。例如,查询项目是否存在于一个 table、一些计算、查询另一个 table 等

禁用查询的异步要求不是一个选项,我更喜欢按预期使用 Room。

首先想到的是嵌套回调,但是太丑了。 第二个想法是查询所有需要的数据,只有在收到所有回调后才启动一个方法。这听起来也不太好,在某些情况下,一个回调具有另一个查询所需的数据。

奇怪的是我没有找到任何相关的论坛帖子或文章来处理这个问题。 有人已经处理了吗?有什么想法吗?

大多数 @Dao 方法是同步的,return 在您调用它们的任何线程上获取它们的结果。例外情况是具有反应性 return 类型的 @Query 方法,例如 Maybe<List<Goal>>LiveData<List<Goal>>,其中方法 return 反应性类型和结果异步传递给订户。

因此,对于具有更复杂业务逻辑的情况,您有三个主要的行动方案(我现在能想到的):

  1. 使用 RxJava 并尝试将所有业务逻辑压缩到一个可观察的链中。有很多 RxJava 运算符,因此 map()flatMap()switchMap()weAreLostWhereDidWePutTheMap() 等的一些组合可能就足够了。

  2. 在后台线程上完成工作,由 LiveData 子类调解,因此消费者可以订阅 LiveData.

  3. 使用经典线程选项(例如,IntentService)或更现代的替换选项(例如,JobIntentService)。