几个不同房间查询的策略
Tactic for several different Room queries
在重构应用程序时,我决定使用空间(和其他架构组件)。一切顺利,直到我到达异步的数据库查询。我没问题,我可以使用 LiveData 回调更新视图。
但是随着较小的查询相互跟随出现了问题 - 没有线程限制很容易,您可以直接使用变量。
在遗留代码中有很多设置,其中需要大量来自不同 table 的小数据。例如,查询项目是否存在于一个 table、一些计算、查询另一个 table 等
禁用查询的异步要求不是一个选项,我更喜欢按预期使用 Room。
首先想到的是嵌套回调,但是太丑了。
第二个想法是查询所有需要的数据,只有在收到所有回调后才启动一个方法。这听起来也不太好,在某些情况下,一个回调具有另一个查询所需的数据。
奇怪的是我没有找到任何相关的论坛帖子或文章来处理这个问题。
有人已经处理了吗?有什么想法吗?
大多数 @Dao
方法是同步的,return 在您调用它们的任何线程上获取它们的结果。例外情况是具有反应性 return 类型的 @Query
方法,例如 Maybe<List<Goal>>
或 LiveData<List<Goal>>
,其中方法 return 反应性类型和结果异步传递给订户。
因此,对于具有更复杂业务逻辑的情况,您有三个主要的行动方案(我现在能想到的):
使用 RxJava 并尝试将所有业务逻辑压缩到一个可观察的链中。有很多 RxJava 运算符,因此 map()
、flatMap()
、switchMap()
、weAreLostWhereDidWePutTheMap()
等的一些组合可能就足够了。
在后台线程上完成工作,由 LiveData
子类调解,因此消费者可以订阅 LiveData
.
使用经典线程选项(例如,IntentService
)或更现代的替换选项(例如,JobIntentService
)。
在重构应用程序时,我决定使用空间(和其他架构组件)。一切顺利,直到我到达异步的数据库查询。我没问题,我可以使用 LiveData 回调更新视图。
但是随着较小的查询相互跟随出现了问题 - 没有线程限制很容易,您可以直接使用变量。
在遗留代码中有很多设置,其中需要大量来自不同 table 的小数据。例如,查询项目是否存在于一个 table、一些计算、查询另一个 table 等
禁用查询的异步要求不是一个选项,我更喜欢按预期使用 Room。
首先想到的是嵌套回调,但是太丑了。 第二个想法是查询所有需要的数据,只有在收到所有回调后才启动一个方法。这听起来也不太好,在某些情况下,一个回调具有另一个查询所需的数据。
奇怪的是我没有找到任何相关的论坛帖子或文章来处理这个问题。 有人已经处理了吗?有什么想法吗?
大多数 @Dao
方法是同步的,return 在您调用它们的任何线程上获取它们的结果。例外情况是具有反应性 return 类型的 @Query
方法,例如 Maybe<List<Goal>>
或 LiveData<List<Goal>>
,其中方法 return 反应性类型和结果异步传递给订户。
因此,对于具有更复杂业务逻辑的情况,您有三个主要的行动方案(我现在能想到的):
使用 RxJava 并尝试将所有业务逻辑压缩到一个可观察的链中。有很多 RxJava 运算符,因此
map()
、flatMap()
、switchMap()
、weAreLostWhereDidWePutTheMap()
等的一些组合可能就足够了。在后台线程上完成工作,由
LiveData
子类调解,因此消费者可以订阅LiveData
.使用经典线程选项(例如,
IntentService
)或更现代的替换选项(例如,JobIntentService
)。