Как я могу вернуть результат запроса к базе данных комнаты в среде Android Studio/kotlin/jetpack потокобезопасным способAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Как я могу вернуть результат запроса к базе данных комнаты в среде Android Studio/kotlin/jetpack потокобезопасным способ

Сообщение Anonymous »

Я использую среду базы данных 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»