Продолжение истории создания мобильного приложения NUMERO2 с помощью App Inventor.

После объявления переменных и их инициализации настало время научить программу выполнять простые трюки; сохранять пользовательские данные, очищать поля редактирования, открывать другие экраны и форматировать данные.

Сохранение переменных

Работа с хранилищем TinyDB чем-то напоминает операции по чтению/записи в файл инициализации (*.ini).

Для сохранения данных используем компонент TinyDB, а сам код оформим в виде процедуры StoreData(), так как он понадобится в нескольких местах программы.

Для удобства имена ключей (параметр “тег” в методе “СохранитьЗначение”) совпадают с именами переменных.

Заглавные буквы в именах

По правилам написания имен они должны начинаться с заглавной буквы. Настроек у компонента ввода текста, отвечающих за эту фичу, я не обнаружил, поэтому создал функцию FirstUpper(), которая выполняет замену первой буквы на заглавную.

Обратите внимание, эта функция имеет входной параметр “х” – строку, которая будет подвергнута преобразованию и возвращена как результат.

Проверка данных

Прежде чем сохранять или обрабатывать данные нам потребуется выполнить проверку (валидацию) данных. Для этого удобно создать функцию CheckData(), которая будет возвращать логическое значение True в случае успеха и False если проверка провалится.

Сама проверка простая: дата рождения, фамилия и имя не должны быть пустыми строками.

Так как кроме вычислений функция выполняет отображение сообщения, то для её создания потребовались специальные блоки: объявление локальной переменной “Result” и блок “выполнить” – контейнер для тела функции.

Форматирование даты

Для ввода даты используется стандартный компонент “ВыборДаты”, работа которого базируется на возможностях ОС Android: отображается календарь, где пользователь должен выбрать нужную дату. Компонент не очень удобный, но зато гарантирует правильность ввода даты. Саму дату в приложении я храню как строку в формате DD.MM.YYYY. Форматирование необходимо выполнить самостоятельно, для этого я создал обработчик, который вызывается после того, как пользователь выбрал дату. Обработчик помещает результат в поле редактирования, у которого установлено свойство “Только для чтения”.

Для добавления ведущих нулей я использовал классический приём: прибавлял значения месяца (дня) к сотне, а потом извлекал результат как текст, используя последние два символа из трёх.

Навигация по экранам

Напомню, что в верхней части экрана находятся кнопки главного меню для перехода на другие экраны приложения: “Пифагор”, “Арканы”, “Цикл”, “Сервис”. Кнопка “Найти” отрывает отдельный экран, в котором отображается список людей.

Переход к другим экранам похож на вызов модельного окна в Windows, так как стандартная кнопка смартфона “Назад” по умолчанию закрывает текущий экран приложения и возвращает управление к вызывающему экрану.

Вызов экрана “Сервис” не требует передачи данных, поэтому он весьма прост:

Вызов экранов “Аркан”, “Цикл” и “Пифагор” выглядят одинаково: сначала выполняется проверка введенных данных, затем данные сохраняются и после открывается нужный экран.

Передавать данные в другой экран можно через специальный параметр, который может принимать данные любой структуры. Но проще использовать для этого возможности TinyDB: при изменении состава передаваемых данных не нужно будет перепрограммировать логику извлечения данных во всех экранах. 

Вызов экрана со списком людей не требует проверки, зато требует обновления данных.

Редактирование

Главный экран приложения NUMERO2 по сути является формой редактирования, в которой отображается текущая “запись” из списка физических лиц. Поэтому на ней расположены две специальные кнопки: “Сбросить” и “Записать”.

Кнопка “Сбросить” очищает поля ввода и подготавливает приложение для ввода новых данных. Кнопка “Записать” сохраняет информацию в список людей, который доступен для просмотра нажатием описанной ранее кнопкой “Найти”.

Сбросить

При нажатии кнопки очищаются поля ввода данных и сбрасывается индекс выбранного элемента NameIndex. Изменения сохраняются в TinyDB.

Сохранить

Сохранение данных – сложная процедура, которая работает в двух режимах: добавление или редактирование. За это отвечает переменная NameIndex:

  • 0 – данные добавляются
  • 1..n – данные с указанным индексом редактируются

Процедура выглядит внушительно, отчасти это обусловлено особенностями визуального представления кода в App Inventor, потому как сам алгоритм не очень сложный.

После проверки валидности данных имена записываются с заглавного символа. Так как отчество может быть пустым значением, перед вызовом функции FirstUpper() необходима проверка. Эту проверку лучше перенести внутрь FirstUpper, чтобы сделать её более устойчивой к возможным ошибкам.

Затем из хранилища вытаскивается список NameList. Каждый элемент этого списка представляет структуру данных (dictionary), выбор которой обусловлен способом представления данных в компоненте “Список”. Решение весьма спорное с точки зрения простоты, но оно возникло в процессе моего обучения по видеороликам и когда я понял, что формат не самый удачный, приложение было уже почти готово. Из плюсов этого варианта могу отметить простоту загрузки данных в компонент “Список”, который в этом случае реализуется буквально одной командой. Но об этом я расскажу чуть позже.

После редактирования списка производится его сортировка. У списка есть встроенные возможности для сортировки, но они работают только в том случае, если элементы списка – простой текст. В моём случае для сортировки используется блок, в котором сравниваются определенные внутренние элементы словаря.

После сортировки список NameList и индекс текущей записи NameIndex сохраняются в TinyDB, а пользователь получает уведомление о том, что редактирование/добавление данных завершено.

Сортировка перед записью – это спорное решение. Возможно, лучше было бы сортировать данные в момент загрузки списка перед его отображением. Но в данном случае это оправдано тем, что операция извлечения данных производится чаще, чем операция записи. В любом случае сортировка элементов при работе со списками – это забота программиста, никаких волшебных “ORDER BY” не будет, как и не будет других фокусов с SQL. По крайней мере при использовании TinyDB.

Продолжение следует.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *