Я использую среду базы данных Android Studio, Kotlin, Jetpack и Room. Я хотел бы реализовать запрос, который возвращает результат. Android требует, чтобы этот тип запроса выполнялся в отдельном потоке, чтобы избежать блокировки потока пользовательского интерфейса.
Мой код основан на руководстве https://iifx.dev/en/articles/457770601/ ... p-tutorial. В этом руководстве не рассматривается запрос, который возвращает результат в некомпонуемом контексте. В приведенном выше учебнике IIFX используется функциональность Kotlin Flow для возврата данных, но они собираются с помощью функции CollectAsState(), которую можно реализовать только в составной функции.
Я хотел бы собрать данные в функции обработчика событий для переключателя, который является несоставной функцией и поэтому рисует ошибку с помощью функции CollectAsState(). Обработчик событий обновляет переменную, используя синтаксис Remember, что приводит к заполнению текстового поля пользовательского интерфейса.
Информация на странице https://developer.android.com/training/ ... nc-queries предполагает, что правильный способ реализации одноразового запроса — это использование сопрограмм Kotlin и функций приостановки.
Итак, как мне собрать результаты функции приостановки в некомпонуемом событии обработчик?
Вот соответствующий код. Этот код, когда он будет завершен, скомпилируется и запустится. при нажатии переключателя заполняются только инициализированные значения, а не желаемые результаты базы данных.
@Dao
interface TravelDestinationDao {
@Query("SELECT * FROM travel_destinations WHERE id = :idx")
fun getOneDestination(idx: Int): Flow
}
В классе модели представления getOneDestinationSuspend предназначен для реализации запуска/приостановки. Функция getOneDestination предназначена для реализации потока.
class TravelDestinationViewModel(private val destinationDao: TravelDestinationDao) : ViewModel() {
fun getOneDestination(destinationId: Int): Flow {
val destination: Flow = destinationDao.getOneDestination(destinationId)
return destination
}
fun getOneDestinationSuspend(destinationId: Int): TravelDestination {
var destinationx: TravelDestination = TravelDestination(0, "update initial", "", false)
viewModelScope.launch {
val destination: TravelDestination = destinationDao.getOneDestinationx(destinationId)
destinationx = destination
}
return destinationx
}
в действии обновления
@Composable
fun TravelDestinationUpdate(
modifier: Modifier = Modifier,
viewModel: TravelDestinationViewModel = viewModel(
factory = TravelDestinationViewModelFactory(
AppDatabase.getDatabase(LocalContext.current).travelDestinationDao()
)
)
) {
var travelDestination: TravelDestination? = null
var name by remember { mutableStateOf("") }
var country by remember { mutableStateOf("") }
var visited: Boolean by remember { mutableStateOf(false) }
val destinations by viewModel.allDestinations.collectAsState(initial = emptyList())
val options = destinations
val (selectedOption, onOptionSelected) = remember { mutableIntStateOf(0) }
val context = LocalContext.current
Column (
Modifier.fillMaxWidth().absolutePadding(10.dp, 100.dp, 10.dp, 0.dp), horizontalAlignment = Alignment.CenterHorizontally)
{
Spacer(modifier = Modifier.height(20.dp))
TextField(value = name, onValueChange = { name = it }, label = { Text("Destination") })
TextField(value = country, onValueChange = { country = it }, label = { Text("Country") })
Text("check here if located has been visited")
Checkbox(
checked = visited,
onCheckedChange = { visited = it }
)
Button(onClick = {
var destination = TravelDestination(name = name, country = country, visited = visited)
viewModel.deleteOneDestination(selectedOption)
name = ""
country = ""
visited = false
}) {
Text("Update Destination")
}
// Spacer(modifier = Modifier.height(20.dp))
Button(onClick = {
intentMainActivityx(context)
}) {
Text("Back to main activity")
}
Spacer(modifier = Modifier.height(20.dp))
LazyColumn(modifier = modifier) {
items(destinations) { destination ->
var locationText = destination.name + ", " + destination.country
var visitedText = if (destination.visited) "Visited" else "Not Visited"
Text(text = locationText)
Text(text = visitedText)
Text(text = "----------------")
// You can add buttons here to delete the destination
// onClick = { viewModel.deleteDestination(destination) }
}
}
Spacer(modifier = Modifier.height(20.dp))
// the next column is from
// https://www.bing.com/search? q=android%20studio%20radio%20buttons%20sample%20code%20%2B%20id%20compose&qs=n&form=QBRE&sp=-1&ghc=1&lq=0&pq=android%20studio%20radio%20buttons%20sample%20code%20%2B%20id%20compose&sc=12-53&sk=&cvid=D46600FC69EF4DF9950544C9699A83B6
// or a bing search for android studio radio buttons sample code + id compose
Column(Modifier.selectableGroup()) {
options.forEach { option ->
Row(
Modifier
.fillMaxWidth()
.selectable(
selected = (option.id == selectedOption),
// selected = (option.id == 0),
// android requires that queries happen in a separate thread
// the query below is from the copilot answer to
// https://www.bing.com/search?q=android+c ... F621C3790B
onClick = {
onOptionSelected(option.id)
val travelDestination = viewModel.getOneDestinationx(option.id)
name = travelDestination.name
country = travelDestination.country
visited = travelDestination.visited
},
role = Role.RadioButton
)
.padding(16.dp),
verticalAlignment = Alignment.CenterVertically
) {
RadioButton(
selected = (option.id == selectedOption),
onClick = null // Accessibility best practice
)
Text(
text = option.name + " " + option.country,
Modifier.padding(start = 16.dp),
style = MaterialTheme.typography.bodyLarge
)
}
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/798 ... tudio-kotl
Как я могу вернуть результат запроса к базе данных комнаты в среде Android Studio/kotlin/jetpack потокобезопасным способ ⇐ Android
Форум для тех, кто программирует под Android
1762191556
Anonymous
Я использую среду базы данных Android Studio, Kotlin, Jetpack и Room. Я хотел бы реализовать запрос, который возвращает результат. Android требует, чтобы этот тип запроса выполнялся в отдельном потоке, чтобы избежать блокировки потока пользовательского интерфейса.
Мой код основан на руководстве https://iifx.dev/en/articles/457770601/implementing-room-database-in-jetpack-compose-a-step-by-step-tutorial. В этом руководстве не рассматривается запрос, который возвращает результат в некомпонуемом контексте. В приведенном выше учебнике IIFX используется функциональность Kotlin Flow для возврата данных, но они собираются с помощью функции CollectAsState(), которую можно реализовать только в составной функции.
Я хотел бы собрать данные в функции обработчика событий для переключателя, который является несоставной функцией и поэтому рисует ошибку с помощью функции CollectAsState(). Обработчик событий обновляет переменную, используя синтаксис Remember, что приводит к заполнению текстового поля пользовательского интерфейса.
Информация на странице https://developer.android.com/training/data-storage/room/async-queries предполагает, что правильный способ реализации одноразового запроса — это использование сопрограмм Kotlin и функций приостановки.
Итак, как мне собрать результаты функции приостановки в некомпонуемом событии обработчик?
Вот соответствующий код. Этот код, когда он будет завершен, скомпилируется и запустится. при нажатии переключателя заполняются только инициализированные значения, а не желаемые результаты базы данных.
@Dao
interface TravelDestinationDao {
@Query("SELECT * FROM travel_destinations WHERE id = :idx")
fun getOneDestination(idx: Int): Flow
}
В классе модели представления getOneDestinationSuspend предназначен для реализации запуска/приостановки. Функция getOneDestination предназначена для реализации потока.
class TravelDestinationViewModel(private val destinationDao: TravelDestinationDao) : ViewModel() {
fun getOneDestination(destinationId: Int): Flow {
val destination: Flow = destinationDao.getOneDestination(destinationId)
return destination
}
fun getOneDestinationSuspend(destinationId: Int): TravelDestination {
var destinationx: TravelDestination = TravelDestination(0, "update initial", "", false)
viewModelScope.launch {
val destination: TravelDestination = destinationDao.getOneDestinationx(destinationId)
destinationx = destination
}
return destinationx
}
в действии обновления
@Composable
fun TravelDestinationUpdate(
modifier: Modifier = Modifier,
viewModel: TravelDestinationViewModel = viewModel(
factory = TravelDestinationViewModelFactory(
AppDatabase.getDatabase(LocalContext.current).travelDestinationDao()
)
)
) {
var travelDestination: TravelDestination? = null
var name by remember { mutableStateOf("") }
var country by remember { mutableStateOf("") }
var visited: Boolean by remember { mutableStateOf(false) }
val destinations by viewModel.allDestinations.collectAsState(initial = emptyList())
val options = destinations
val (selectedOption, onOptionSelected) = remember { mutableIntStateOf(0) }
val context = LocalContext.current
Column (
Modifier.fillMaxWidth().absolutePadding(10.dp, 100.dp, 10.dp, 0.dp), horizontalAlignment = Alignment.CenterHorizontally)
{
Spacer(modifier = Modifier.height(20.dp))
TextField(value = name, onValueChange = { name = it }, label = { Text("Destination") })
TextField(value = country, onValueChange = { country = it }, label = { Text("Country") })
Text("check here if located has been visited")
Checkbox(
checked = visited,
onCheckedChange = { visited = it }
)
Button(onClick = {
var destination = TravelDestination(name = name, country = country, visited = visited)
viewModel.deleteOneDestination(selectedOption)
name = ""
country = ""
visited = false
}) {
Text("Update Destination")
}
// Spacer(modifier = Modifier.height(20.dp))
Button(onClick = {
intentMainActivityx(context)
}) {
Text("Back to main activity")
}
Spacer(modifier = Modifier.height(20.dp))
LazyColumn(modifier = modifier) {
items(destinations) { destination ->
var locationText = destination.name + ", " + destination.country
var visitedText = if (destination.visited) "Visited" else "Not Visited"
Text(text = locationText)
Text(text = visitedText)
Text(text = "----------------")
// You can add buttons here to delete the destination
// onClick = { viewModel.deleteDestination(destination) }
}
}
Spacer(modifier = Modifier.height(20.dp))
// the next column is from
// https://www.bing.com/search? q=android%20studio%20radio%20buttons%20sample%20code%20%2B%20id%20compose&qs=n&form=QBRE&sp=-1&ghc=1&lq=0&pq=android%20studio%20radio%20buttons%20sample%20code%20%2B%20id%20compose&sc=12-53&sk=&cvid=D46600FC69EF4DF9950544C9699A83B6
// or a bing search for android studio radio buttons sample code + id compose
Column(Modifier.selectableGroup()) {
options.forEach { option ->
Row(
Modifier
.fillMaxWidth()
.selectable(
selected = (option.id == selectedOption),
// selected = (option.id == 0),
// android requires that queries happen in a separate thread
// the query below is from the copilot answer to
// https://www.bing.com/search?q=android+compose+jetpack+room+database+query+return+value+thread+safe&form=QBLH&sp=-1&ghc=1&lq=0&pq=android+compose+jetpack+room+database+query+return+value+thread+safe&sc=7-68&qs=n&sk=&cvid=C1D33DB336194626A2D4FEF621C3790B
onClick = {
onOptionSelected(option.id)
val travelDestination = viewModel.getOneDestinationx(option.id)
name = travelDestination.name
country = travelDestination.country
visited = travelDestination.visited
},
role = Role.RadioButton
)
.padding(16.dp),
verticalAlignment = Alignment.CenterVertically
) {
RadioButton(
selected = (option.id == selectedOption),
onClick = null // Accessibility best practice
)
Text(
text = option.name + " " + option.country,
Modifier.padding(start = 16.dp),
style = MaterialTheme.typography.bodyLarge
)
}
}
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79807446/how-can-i-return-a-result-from-a-room-database-query-in-an-android-studio-kotl[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия