我已经读过在房间数据库中查询数据的方法之一是使用Livedata,它可以在主线程上使用,因为它是异步的。
我想使用LiveData而不是RxJava或AsyncTask。
对于我的存储库类中的这个,我有函数getSomeData(),它返回LiveData>我在viewModel构造函数中调用此函数:
private var mObservableSomeData: LiveData<List<SomeData>>
init {
mObservableSomeData = repository.getSomeData()
}
fun getSomeData(): LiveData<List<SomeData>> {
return mObservableSomeData
}
然而它崩溃说:
无法访问主线程上的数据库,因为它可能会长时间锁定UI。
我该怎么办?
答案 0 :(得分:2)
正如@LieForBananas指出的那样,很可能在插入时出现错误。每当你有@Query并且将返回的数据包装到可观察的例如LiveData或Flowable,默认情况下,查询会在后台线程上执行。
请记住,Room数据库确保返回的可观察查询在后台线程上运行。这就是为什么如果将返回值包装在Flowable中,则在创建观察者时不必显式编写 .subscribeOn(Schedulers.io)的原因。而如果您正在使用Flowable进行网络调用(最好使用单个方法,因为通常我们只需要发出一次),则必须显式编写.subscribeOn(Scheduler.io())才能在后台线程上运行该调用。>
答案 1 :(得分:0)
Room不允许在主线程上进行数据库操作,除非您允许主线程上的数据库使用allowMainThreadQueries()
。
MyApp.database = Room.databaseBuilder(this,AppDatabase::class.java,"MyDatabase")
.allowMainThreadQueries()
.build()