Следующий код базы данных 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) }
}
}
Обратитесь к документам для получения дополнительной информации и примера кодовой базы — developer.android.com/training/data-storage/…
Если вы хотите перейти к своим операциям с базой данных на уровень данных, вы должны сделать это в Repository
или даже лучше в UseCase/Interactor
. ViewModel - это не уровень данных, а уровень представления, на уровне ViewModel ваши данные должны быть уже данными представления пользовательского интерфейса, которые хранят только свойства, связанные с пользовательским интерфейсом.
Если вы хотите использовать сопрограммы, пометьте свои функции ключевым словом 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) {
}
}
}
Все, что связано с данными, должно обрабатываться на уровне данных, а не на уровне представления. Используйте ViewModel для обработки выборки данных комнаты и используйте сопрограммы с
Dispatcher.IO
для перемещения операций с базой данных из основного потока.