几种不同的房间查询的策略

时间:2017-09-13 16:02:23

标签: android android-room

在折射应用程序时,我决定使用房间(以及其他架构组件)。一切顺利,直到我到达数据库查询,这是异步。我很好,我可以使用LiveData回调更新视图。

但是问题出现在较小的查询之后 - 没有线程限制很容易,你可以直接使用变量。

在遗留代码中有很多设置,其中从不同的表中一个接一个地需要相当多的小数据。例如,查询一个表中是否存在项目,一些计算,查询另一个表等等。

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

首先想到的是嵌套回调,但它太难看了。 第二个想法是查询所有必需的数据,仅在收到所有回调后启动方法。它听起来也不太好,有些情况下一个回调函数需要另一个查询所需的数据。

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

1 个答案:

答案 0 :(得分:2)

大多数@Dao方法是同步的,在你调用它们的任何线程上返回它们的结果。例外是具有被动返回类型的@Query方法,例如Maybe<List<Goal>>LiveData<List<Goal>>,其中方法返回被动类型,结果以异步方式传递给订阅者。

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

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

  2. 在后台线程上进行工作,由LiveData子类调解,以便消费者可以订阅LiveData

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