Продолжение истории создания мобильного приложения NUMERO2 с помощью App Inventor.
После объявления переменных и их инициализации настало время научить программу выполнять простые трюки; сохранять пользовательские данные, очищать поля редактирования, открывать другие экраны и форматировать данные.
Сохранение переменных
Работа с хранилищем TinyDB чем-то напоминает операции по чтению/записи в файл инициализации (*.ini).
Для сохранения данных используем компонент TinyDB, а сам код оформим в виде процедуры StoreData(), так как он понадобится в нескольких местах программы.
![](https://k245.ru/wp-content/uploads/2024/03/StoreData-1024x635.png)
Для удобства имена ключей (параметр “тег” в методе “СохранитьЗначение”) совпадают с именами переменных.
Заглавные буквы в именах
По правилам написания имен они должны начинаться с заглавной буквы. Настроек у компонента ввода текста, отвечающих за эту фичу, я не обнаружил, поэтому создал функцию FirstUpper(), которая выполняет замену первой буквы на заглавную.
![](https://k245.ru/wp-content/uploads/2024/03/FirstUpper-1024x330.png)
Обратите внимание, эта функция имеет входной параметр “х” – строку, которая будет подвергнута преобразованию и возвращена как результат.
Проверка данных
Прежде чем сохранять или обрабатывать данные нам потребуется выполнить проверку (валидацию) данных. Для этого удобно создать функцию CheckData(), которая будет возвращать логическое значение True в случае успеха и False если проверка провалится.
Сама проверка простая: дата рождения, фамилия и имя не должны быть пустыми строками.
![](https://k245.ru/wp-content/uploads/2024/03/CheckData-1024x483.png)
Так как кроме вычислений функция выполняет отображение сообщения, то для её создания потребовались специальные блоки: объявление локальной переменной “Result” и блок “выполнить” – контейнер для тела функции.
Форматирование даты
Для ввода даты используется стандартный компонент “ВыборДаты”, работа которого базируется на возможностях ОС Android: отображается календарь, где пользователь должен выбрать нужную дату. Компонент не очень удобный, но зато гарантирует правильность ввода даты. Саму дату в приложении я храню как строку в формате DD.MM.YYYY. Форматирование необходимо выполнить самостоятельно, для этого я создал обработчик, который вызывается после того, как пользователь выбрал дату. Обработчик помещает результат в поле редактирования, у которого установлено свойство “Только для чтения”.
![](https://k245.ru/wp-content/uploads/2024/03/GetData-1024x335.png)
Для добавления ведущих нулей я использовал классический приём: прибавлял значения месяца (дня) к сотне, а потом извлекал результат как текст, используя последние два символа из трёх.
Навигация по экранам
Напомню, что в верхней части экрана находятся кнопки главного меню для перехода на другие экраны приложения: “Пифагор”, “Арканы”, “Цикл”, “Сервис”. Кнопка “Найти” отрывает отдельный экран, в котором отображается список людей.
![](https://k245.ru/wp-content/uploads/2024/02/Screen1.jpg)
Переход к другим экранам похож на вызов модельного окна в Windows, так как стандартная кнопка смартфона “Назад” по умолчанию закрывает текущий экран приложения и возвращает управление к вызывающему экрану.
Вызов экрана “Сервис” не требует передачи данных, поэтому он весьма прост:
![](https://k245.ru/wp-content/uploads/2024/03/OpenServ.png)
Вызов экранов “Аркан”, “Цикл” и “Пифагор” выглядят одинаково: сначала выполняется проверка введенных данных, затем данные сохраняются и после открывается нужный экран.
![](https://k245.ru/wp-content/uploads/2024/03/OpenScreen.png)
Передавать данные в другой экран можно через специальный параметр, который может принимать данные любой структуры. Но проще использовать для этого возможности TinyDB: при изменении состава передаваемых данных не нужно будет перепрограммировать логику извлечения данных во всех экранах.
Вызов экрана со списком людей не требует проверки, зато требует обновления данных.
![](https://k245.ru/wp-content/uploads/2024/03/FindClick.png)
![](https://k245.ru/wp-content/uploads/2024/03/OnClose-1024x233.png)
Редактирование
Главный экран приложения NUMERO2 по сути является формой редактирования, в которой отображается текущая “запись” из списка физических лиц. Поэтому на ней расположены две специальные кнопки: “Сбросить” и “Записать”.
Кнопка “Сбросить” очищает поля ввода и подготавливает приложение для ввода новых данных. Кнопка “Записать” сохраняет информацию в список людей, который доступен для просмотра нажатием описанной ранее кнопкой “Найти”.
Сбросить
При нажатии кнопки очищаются поля ввода данных и сбрасывается индекс выбранного элемента NameIndex. Изменения сохраняются в TinyDB.
![](https://k245.ru/wp-content/uploads/2024/03/Reset.png)
Сохранить
Сохранение данных – сложная процедура, которая работает в двух режимах: добавление или редактирование. За это отвечает переменная NameIndex:
- 0 – данные добавляются
- 1..n – данные с указанным индексом редактируются
Процедура выглядит внушительно, отчасти это обусловлено особенностями визуального представления кода в App Inventor, потому как сам алгоритм не очень сложный.
![](https://k245.ru/wp-content/uploads/2024/03/Save-1017x1024.png)
После проверки валидности данных имена записываются с заглавного символа. Так как отчество может быть пустым значением, перед вызовом функции FirstUpper() необходима проверка. Эту проверку лучше перенести внутрь FirstUpper, чтобы сделать её более устойчивой к возможным ошибкам.
Затем из хранилища вытаскивается список NameList. Каждый элемент этого списка представляет структуру данных (dictionary), выбор которой обусловлен способом представления данных в компоненте “Список”. Решение весьма спорное с точки зрения простоты, но оно возникло в процессе моего обучения по видеороликам и когда я понял, что формат не самый удачный, приложение было уже почти готово. Из плюсов этого варианта могу отметить простоту загрузки данных в компонент “Список”, который в этом случае реализуется буквально одной командой. Но об этом я расскажу чуть позже.
После редактирования списка производится его сортировка. У списка есть встроенные возможности для сортировки, но они работают только в том случае, если элементы списка – простой текст. В моём случае для сортировки используется блок, в котором сравниваются определенные внутренние элементы словаря.
После сортировки список NameList и индекс текущей записи NameIndex сохраняются в TinyDB, а пользователь получает уведомление о том, что редактирование/добавление данных завершено.
Сортировка перед записью – это спорное решение. Возможно, лучше было бы сортировать данные в момент загрузки списка перед его отображением. Но в данном случае это оправдано тем, что операция извлечения данных производится чаще, чем операция записи. В любом случае сортировка элементов при работе со списками – это забота программиста, никаких волшебных “ORDER BY” не будет, как и не будет других фокусов с SQL. По крайней мере при использовании TinyDB.
Продолжение следует.