Создание базы данных с несколькими таблицами. Таблицы используются для отслеживания использования компонентов, но мне трудно получить список запросов для заполнения в DropDownMenu. Я хочу ограничить пользователей списком, чтобы мой внешний ключ работал проще. Когда у меня есть вывод Log.d, каким должен быть список, он всегда выводит пустой список []. Надеюсь, приведенного ниже кода достаточно, чтобы показать мою проблему.
База данных:
@Database(
entities =[Bullet::class, Ammo::class],
exportSchema = false,
version = 1
)
abstract class BBDatabase: RoomDatabase() {
abstract val dao: BBDao
}
@Entity (tableName = "Ammo", )
data class Ammo (
val ammoName: String,
val ammoBulletName: String,
@PrimaryKey(autoGenerate = true)
val ammoID: Int=0
)
@Entity (tableName = "Bullet")
data class Bullet (
@PrimaryKey(autoGenerate = false)
val bulletName: String
)
Дао:
@Query("SELECT bulletName FROM Bullet")
fun getBulletNames(): Flow
классы данных:
data class BulletNames(
val bulletName: String,
)
data class AmmoState(
val bulletName: List = emptyList(),
)
Событие:
sealed interface AmmoEvent {
data object ShowDialog : AmmoEvent
}
ViewModel:
@OptIn(ExperimentalCoroutinesApi::class)
class AmmoViewModel(
private val dao: BBDao,
) : ViewModel() {
val bulletName = dao.getBulletNames()
.stateIn(viewModelScope, SharingStarted.Lazily, emptyList())
fun onEvent(event: AmmoEvent) {
when (event) {
AmmoEvent.ShowDialog -> {
_state.update {
it.copy(
isAddingAmmo = true,
ammoBulletName = "",
)
}
}
}
}
}
Главный экран:
@Composable
fun AmmoScreen(
state: AmmoState,
onEvent: (AmmoEvent) -> Unit
){
Scaffold (
floatingActionButton = {
FloatingActionButton(onClick = {
onEvent(AmmoEvent.ShowDialog)
}) {
Icon(imageVector = Icons.Default.Add, contentDescription = "Add Ammo")
}
},
modifier = Modifier.padding(16.dp)
) {_ ->
if(state.isAddingAmmo){
AddAmmoDialog( state = state, onEvent= onEvent)
}
}
Диалоговое окно:
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun AddAmmoDialog(
state: AmmoState,
onEvent: (AmmoEvent) -> Unit,
modifier: Modifier = Modifier,
) {
var expanded by remember { mutableStateOf(false) }
val bulletOptions = state.bulletName
var selectedBullet = ""
AlertDialog(
modifier = modifier,
onDismissRequest = { onEvent(AmmoEvent.HideDialog) },
confirmButton = {
Box(
modifier = Modifier.fillMaxWidth(),
contentAlignment = Alignment.CenterEnd
) {
Button(onClick = {
onEvent(AmmoEvent.SaveAmmo)
}) {
Text(text = "Save")
}
}
},
title = { Text(text = "Add Ammo") },
text = {
Column(
verticalArrangement = Arrangement.spacedBy(8.dp)
) {
OutlinedTextField(
value = state.ammoName,
onValueChange = {
onEvent(AmmoEvent.SetAmmoName(it))
},
placeholder = { Text(text = "Ammo Name") },
label = { Text(text = "Ammo Name") },
)
ExposedDropdownMenuBox(
expanded = expanded,
onExpandedChange = { expanded = !expanded },
modifier = modifier,
) {
OutlinedTextField(
value = selectedBullet,
onValueChange = {},
label = { Text(text = "Select Bullet") },
trailingIcon = { ExposedDropdownMenuDefaults.TrailingIcon(expanded = expanded) },
modifier = Modifier
.menuAnchor()
.fillMaxWidth()
)
ExposedDropdownMenu(
expanded = expanded,
onDismissRequest = { expanded = false }
) {
bulletOptions.forEach { item ->
DropdownMenuItem(
text = { Text(text = item.toString()) },
onClick = {
expanded = false
selectedBullet = item.toString()
onEvent(AmmoEvent.SetAmmoBulletName(item.toString()))
},
)
}
}
}
}
}
)
}
Подробнее здесь: https://stackoverflow.com/questions/788 ... opdownmenu
Получение списка запросов из комнаты для заполнения DropDownMenu ⇐ Android
Форум для тех, кто программирует под Android
-
Anonymous
1722812809
Anonymous
Создание базы данных с несколькими таблицами. Таблицы используются для отслеживания использования компонентов, но мне трудно получить список запросов для заполнения в DropDownMenu. Я хочу ограничить пользователей списком, чтобы мой внешний ключ работал проще. Когда у меня есть вывод Log.d, каким должен быть список, он всегда выводит пустой список []. Надеюсь, приведенного ниже кода достаточно, чтобы показать мою проблему.
База данных:
@Database(
entities =[Bullet::class, Ammo::class],
exportSchema = false,
version = 1
)
abstract class BBDatabase: RoomDatabase() {
abstract val dao: BBDao
}
@Entity (tableName = "Ammo", )
data class Ammo (
val ammoName: String,
val ammoBulletName: String,
@PrimaryKey(autoGenerate = true)
val ammoID: Int=0
)
@Entity (tableName = "Bullet")
data class Bullet (
@PrimaryKey(autoGenerate = false)
val bulletName: String
)
Дао:
@Query("SELECT bulletName FROM Bullet")
fun getBulletNames(): Flow
классы данных:
data class BulletNames(
val bulletName: String,
)
data class AmmoState(
val bulletName: List = emptyList(),
)
Событие:
sealed interface AmmoEvent {
data object ShowDialog : AmmoEvent
}
ViewModel:
@OptIn(ExperimentalCoroutinesApi::class)
class AmmoViewModel(
private val dao: BBDao,
) : ViewModel() {
val bulletName = dao.getBulletNames()
.stateIn(viewModelScope, SharingStarted.Lazily, emptyList())
fun onEvent(event: AmmoEvent) {
when (event) {
AmmoEvent.ShowDialog -> {
_state.update {
it.copy(
isAddingAmmo = true,
ammoBulletName = "",
)
}
}
}
}
}
Главный экран:
@Composable
fun AmmoScreen(
state: AmmoState,
onEvent: (AmmoEvent) -> Unit
){
Scaffold (
floatingActionButton = {
FloatingActionButton(onClick = {
onEvent(AmmoEvent.ShowDialog)
}) {
Icon(imageVector = Icons.Default.Add, contentDescription = "Add Ammo")
}
},
modifier = Modifier.padding(16.dp)
) {_ ->
if(state.isAddingAmmo){
AddAmmoDialog( state = state, onEvent= onEvent)
}
}
Диалоговое окно:
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun AddAmmoDialog(
state: AmmoState,
onEvent: (AmmoEvent) -> Unit,
modifier: Modifier = Modifier,
) {
var expanded by remember { mutableStateOf(false) }
val bulletOptions = state.bulletName
var selectedBullet = ""
AlertDialog(
modifier = modifier,
onDismissRequest = { onEvent(AmmoEvent.HideDialog) },
confirmButton = {
Box(
modifier = Modifier.fillMaxWidth(),
contentAlignment = Alignment.CenterEnd
) {
Button(onClick = {
onEvent(AmmoEvent.SaveAmmo)
}) {
Text(text = "Save")
}
}
},
title = { Text(text = "Add Ammo") },
text = {
Column(
verticalArrangement = Arrangement.spacedBy(8.dp)
) {
OutlinedTextField(
value = state.ammoName,
onValueChange = {
onEvent(AmmoEvent.SetAmmoName(it))
},
placeholder = { Text(text = "Ammo Name") },
label = { Text(text = "Ammo Name") },
)
ExposedDropdownMenuBox(
expanded = expanded,
onExpandedChange = { expanded = !expanded },
modifier = modifier,
) {
OutlinedTextField(
value = selectedBullet,
onValueChange = {},
label = { Text(text = "Select Bullet") },
trailingIcon = { ExposedDropdownMenuDefaults.TrailingIcon(expanded = expanded) },
modifier = Modifier
.menuAnchor()
.fillMaxWidth()
)
ExposedDropdownMenu(
expanded = expanded,
onDismissRequest = { expanded = false }
) {
bulletOptions.forEach { item ->
DropdownMenuItem(
text = { Text(text = item.toString()) },
onClick = {
expanded = false
selectedBullet = item.toString()
onEvent(AmmoEvent.SetAmmoBulletName(item.toString()))
},
)
}
}
}
}
}
)
}
Подробнее здесь: [url]https://stackoverflow.com/questions/78831940/getting-query-list-from-room-to-populate-dropdownmenu[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия