如何替换 Kotlin Compose Room 数据库中的 allowMainThreadQueries
How to replace allowMainThreadQueries in Kotlin Compose Room Database
以下 Kotlin/Room 数据库代码运行良好,但我需要离开主线程。
我已经阅读了各种复杂的教程,但一个简单的示例(如果可能的话)真的很有帮助!
@Composable
fun myApp(myContext: Context) {
val db = Room.databaseBuilder (
myContext,
AppDatabase::class.java,
"test.db")
.allowMainThreadQueries() // How to eliminate this line?
.createFromAsset("test.db")
.build()
val itemDAO = db.itemDAO()
var itemList = remember { mutableStateListOf( itemDAO.getAll() ) }
println("******************** Print Item List ********************")
for (i in 0 until itemList.size) {
itemList[i].listIterator().forEach { println(it.first_name + " " + it.last_name) }
}
}
如果您想将数据库操作转移到数据层,您应该在 Repository
中完成,甚至在 UseCase/Interactor
中更好。 ViewModel 不是数据层而是表示层,在 ViewModel 级别,您的数据应该已经是 UI 表示数据,仅存储 ui 相关属性。
如果您想使用协程,请使用 suspend
关键字标记您的函数,这样它们将在 Room 自己的线程中执行数据库操作。而且您需要在范围内调用它,因为它们将是 suspending
函数。
viewModelScope.launch {
try {
val itemDAO = db.itemDAO()
val items = itemDAO.getAll()
// You can update value of MutableState with these items
} catch (e: Exception) {
}
}
}
以下 Kotlin/Room 数据库代码运行良好,但我需要离开主线程。
我已经阅读了各种复杂的教程,但一个简单的示例(如果可能的话)真的很有帮助!
@Composable
fun myApp(myContext: Context) {
val db = Room.databaseBuilder (
myContext,
AppDatabase::class.java,
"test.db")
.allowMainThreadQueries() // How to eliminate this line?
.createFromAsset("test.db")
.build()
val itemDAO = db.itemDAO()
var itemList = remember { mutableStateListOf( itemDAO.getAll() ) }
println("******************** Print Item List ********************")
for (i in 0 until itemList.size) {
itemList[i].listIterator().forEach { println(it.first_name + " " + it.last_name) }
}
}
如果您想将数据库操作转移到数据层,您应该在 Repository
中完成,甚至在 UseCase/Interactor
中更好。 ViewModel 不是数据层而是表示层,在 ViewModel 级别,您的数据应该已经是 UI 表示数据,仅存储 ui 相关属性。
如果您想使用协程,请使用 suspend
关键字标记您的函数,这样它们将在 Room 自己的线程中执行数据库操作。而且您需要在范围内调用它,因为它们将是 suspending
函数。
viewModelScope.launch {
try {
val itemDAO = db.itemDAO()
val items = itemDAO.getAll()
// You can update value of MutableState with these items
} catch (e: Exception) {
}
}
}