我在应用程序中使用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是否在内部对工作线程执行所有操作?
答案 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) { }
之类的事情,而可以直接调用该函数。