Я работаю над приложением базы данных для себя ( с помощью комнаты). Одним из входных значений является Quantity, которое является Int. Дело в том, что при переходе на экран «Добавить запись» значение по умолчанию — это O в текстовом поле, и нажатие на него для ввода числа раздражает, потому что в половине случаев введенное число добавляется к 0… например если я щелкну поле и нажму «2», тогда число будет «20», и мне придется стереть 0.
Итак, я поискал пустой ввод текста для целых чисел и просто глядя на то, что я делаю с VIewModel и прочим, я подумал: «Эй, а что, если я могу просто добавить сюда запятую и скопировать это измененное значение в два разных значения одновременно?» и... ну это сработало? Я добавил дополнительное значение к DataClass в модели представления, которому был присвоен тип String с пустой строкой. Затем я просто изменил «значение onchange», чтобы скопировать значение как в новое значение, так и в то, которое используется в базе данных с помощью .toIntOrNull.
Это новое добавленное значение (squantity) ни один из них не используется в базе данных, он используется только для этого поля (отображение).
Я не видел этой конкретной вещи ни в одном из моих поисков, и это заставляет меня задаваться вопросом, почему (все говорит об использовании Radix и проверке). Что, вероятно, мне следует добавить значение Radix, по крайней мере, на всякий случай (в случае, если клавиатура не распознает запросы IME, таким образом никакие нечисловые символы не будут случайно введены).
Я протестировал его, и он в основном работает (только одна небольшая проблема, которая, я думаю, решена). Он правильно добавлял элемент в базу данных и возвращался к экрану списка, пока я ввел какое-то число в поле и введенное число совпадает.
Исключением при тестировании был случай, когда я уходил. поле пустое. В первый раз приложение вылетело, но когда я его перезагрузил, запись была введена в базу данных с количеством 0. Я пробовал это несколько раз, и иногда запись добавлялась без сбоя, иногда да. сбой, но независимо от того, что я указал в качестве целого числа по умолчанию (класс данных ItemDetails в модели представления), оно всегда добавляется с количеством, равным 0, и затем я заметил, что у меня есть копия int как "toIntOrNull() ?: 1" на кодовой странице пользовательского интерфейса. Я заменил этот 1 на 0, и теперь он, кажется, работает без сбоев и сохраняет значение по умолчанию (в настоящее время установлено на 1), введенное в ViewModel, как количество, когда поле при сохранении новой записи остается пустым.
Я также добавил к последней функции "squantity = количество.toString()" (преобразует таблицу базы данных в класс данных), и это, похоже, сработало, существующее значение количества теперь передается в поле, когда я нажимаю на элемент, чтобы перейти на экран редактирования записи.
Ну, правда, у меня 2 вопроса...
- Это нормально?
- Я планировал добавить кнопки +/- для
увеличения/уменьшения значения в этом поле (обновление
количества будет проще, если я добавлю или израсходую что-то, экран «Запись редактирования»
использует то же тело, что и экран «Добавить запись»), будет ли это
потенциально помешать мне сделать это? Я уверен, что смогу написать некоторый
логический код, который, если поле пустое, принимает 0 и добавляет 1.
TextField(
value = itemDetails.squantity,
onValueChange = {
onValueChange(itemDetails.copy(squantity = it, quantity = it.toIntOrNull() ?: 0))
},
modifier = Modifier
.width(54.dp),
visualTransformation = VisualTransformation.None,
enabled = true,
singleLine = true,
textStyle = LocalTextStyle.current.copy(textAlign = TextAlign.End),
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number),
)
А вот соответствующая ViewModel, включая преобразование этого класса данных со строковым значением, добавленным в конце списка в деталях. Значение существует только в классе данных ItemDetails и не копируется в функции, которые преобразуют сведения об элементе в элементы (таблица базы данных), а добавляется в функцию «Элементы (таблица базы данных) в сведения об элементе».
data class ItemUiState(
val itemDetails: ItemDetails = ItemDetails(),
val isEntryValid: Boolean = false
)
data class ItemDetails(
val id: Int = 0,
val brand: String = "",
val blend: String = "",
val type: String = "",
val quantity: Int = 1,
val hated: Boolean = false,
val squantity: String = ""
)
/** convert ItemDetails to Items (Database Table) **/
fun ItemDetails.toItem(): Items = Items(
id = id,
brand = brand,
blend = blend,
type = type,
quantity = quantity,
hated = hated
)
/** convert Items to ItemUiState**/
fun Items.toItemUiState(isEntryValid: Boolean = false): ItemUiState = ItemUiState(
itemDetails = this.toItemDetails(),
isEntryValid = isEntryValid
)
/** convert Items (Database) to ItemDetails (Data Class) **/
fun Items.toItemDetails(): ItemDetails = ItemDetails(
id = id,
brand = brand,
blend = blend,
type = type,
quantity = quantity,
hated = hated,
squantity = quantity.toString()
)
Подробнее здесь: https://stackoverflow.com/questions/788 ... s-but-will