在主线程上访问ROOM DB

时间:2019-09-13 04:34:09

标签: android android-room kotlin-coroutines

我在应用程序中使用ROOM DB,我的代码如下所示-

这是我的回购代码-

override suspend fun storeDataToCache(dataModel: DataModel) {
    //Printing out thread name gives me main thread still
    personalDataDao.insertData(dataModel)
}

这是我的DAO代码-

@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertData(dataModel: DataModel)

这有效。

但是,当我删除suspend关键字时,它给了我-

java.lang.IllegalStateException: Cannot access database on 
the main thread since it may potentially lock the UI for a long period of time.

这很好,因为我试图在主线程上访问ROOM DB。

但是我的问题是,使用suspend关键字而不进行例如线程切换。 withContext(Dispatchers.Default),它如何运作? ROOM DB是否在内部对工作线程执行所有操作?

3 个答案:

答案 0 :(得分:1)

您可以尝试

// Create a file storage based database
INSTANCE = Room.databaseBuilder(context.getApplicationContext(),
                            CustomerRoomDatabase.class, "customer_database")
                            .build();

// Create an in-memory database
INSTANCE = Room.inMemoryDatabaseBuilder(context.getApplicationContext(),
                            CustomerRoomDatabase.class)
                            .build();

INSTANCE = Room.inMemoryDatabaseBuilder(context.getApplicationContext(),
                                CustomerRoomDatabase.class)
                              .allowMainThreadQueries().build();

答案 1 :(得分:0)

在创建RoomDatabase类的实例时,必须设置 allowMainThreadQueries()

INSTANCE = Room.databaseBuilder(
   context.getApplicationContext(), 
   AppDatabase.class, 
   "my_database")
.allowMainThreadQueries()  // add this line
.build();

答案 2 :(得分:0)

是的,当您将函数标记为暂停时,Room会在后台/工作线程中执行查询,然后在完成后返回带有结果(或异常)的协程。 这意味着您不需要执行withContext(Dispatchers.IO) { }之类的事情,而可以直接调用该函数。