在Android的主线程之外的房间中编写查询是强制性的吗?

时间:2019-04-25 04:31:14

标签: android sqlite android-room

我想将Room数据库集成到我的android应用程序(JAVA)中。
我浏览了互联网上有关Room数据库的许多内容,但这些内容都没有消除我的疑虑,这是

  1. 必须从主线程中写查询吗?
  2. 如果是,如果我们在主线程上写查询会怎样?

2 个答案:

答案 0 :(得分:5)

  
      
  1. 必须从主线程中写查询吗?
  2.   

您可以通过使用.allowMainThreadQueries()初始化来允许查询在主线程上运行

 Room.databaseBuilder(this, MyRoomDataBase::class.java, DATABASE_NAME).allowMainThreadQueries()
  
      
  1. 如果是,如果我们在主线程上写查询会怎样?
  2.   

如果您指定了.allowMainThreadQueries(),它将阻塞主线程直到执行查询为止,否则它将抛出IllegalStateException,并且您的应用程序将崩溃。最好不要在主线程上查询

答案 1 :(得分:0)

默认情况下,可观察的房间查询在主UI线程上运行。如果要在主线程上运行它们,则需要使用以下代码进行指定。

Room.databaseBuilder(this, MyRoomDataBase::class.java, DATABASE_NAME).allowMainThreadQueries()

如果您将返回类型包装在LiveData中,则无需设置allowMainThreadQueries(),查询将在具有LiveData的后台线程上异步运行,您可以在其上观察以接收该数据中的更新。

如果您的数据库较小,并且没有对数据库执行任何繁重的操作,则可以允许在主线程上进行查询。否则,构建器可能会长时间锁定UI。