房间,线程和插入/删除查询

时间:2019-08-27 20:31:13

标签: android android-room

所以我知道Room不处理线程,因此要由开发人员来确保它不会在主线程上运行查询。

在AsyncTasks中包装所有查询似乎非常麻烦,但是我意识到我可以改用LiveData。但是,我假设这仅适用于数据查询,而不适用于插入和删除查询?因此,我还是应该将它们包装在AsyncTask中(不求助于其他第三方库吗?)还是有更好的选择?

2 个答案:

答案 0 :(得分:4)

  

所以我知道Room不处理线程,因此要由开发人员来确保它不会在主线程上运行查询。

如果您在Kotlin中使用suspend或DAO函数的反应式返回类型,则房间将处理线程:

  • 科特琳Flow(需要2.2.0或更高房间)
  • LiveData
  • RxJava类型(例如ObservableSingleCompletable

如果您选择不使用这些东西,那么可以,线程取决于您。

  

在AsyncTasks中包装所有查询似乎非常麻烦,但是我意识到我可以改用LiveData。但是,我假设这仅适用于数据查询,而不适用于插入和删除查询?

如果您是指使用@QueryINSERT而不是DELETE的{​​{1}}方法,那么是的,我认为您是正确的。但是,由于SELECT函数可以返回@Insert,因此您可能能够使用Long的{​​{1}}返回@Query。我没有尝试过,我怀疑Room编译器不会识别这种方法,但是总有希望。 :-)

  

所以我还是应该将它们包装在AsyncTask中(不求助于其他第三方库吗?)还是有更好的选择?

我们欢迎您使用普通的INSERTLiveData<Long>Thread或其他任何可为您提供后台线程的Android设备。 Executor特别过时。如果您要使用“房间”之类的现代事物,请全盘使用现代事物(例如,带有协同程序的Kotlin)。

我个人会推荐JobIntentService(对于Kotlin开发人员)或AsyncTask(对于使用RxJava的Java开发人员)。

答案 1 :(得分:0)

  1. 使用RxJava

创建一个Observable,并在其中编写逻辑。您可以订阅可观察对象并获取布尔值。

PagedData
  1. 使用协程