Сохранение и загрузка параметров

Для удобства пользователя все введённые им данные желательно сохранять и восстанавливать при последующем запуске приложения. Значения будем сохранять в файле settings.json в формате JSON, который имеет простую структуру. Имя файла и его расширение мы задаём произвольно, сам файл можно открыть и внести в него изменения в любом текстовом редакторе. Вот как выглядит его содержимое.

{"activity_name":"Приседания", "activity_factor":7.9,"time":30,"weight":50, "height":170,"sex":"женский","age":26, "activity_index":137}

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

Загрузка параметров

Вначале сделаем загрузку данных из файла, заодно проверку на их существование. Для работы с форматом JSON предварительно нужно загрузить библиотеку.

local json = require("json");

Добавим свою функцию loadSettings, которая будет загружать данные из указанного файла и возвращать их в виде таблицы.

function loadSettings(filename)
	-- получаем путь к файлу
	local path = system.pathForFile(filename, system.ResourceDirectory);
	local contents = "";
	local myTable = {};
	local file = io.open(path, "r"); -- открываем файл
	if (file) then -- если такой файл существует
		 local contents = file:read( "*a" ); -- читаем из него данные
		 myTable = json.decode(contents); -- расшифровываем их
		 io.close(file); -- закрываем файл
		 return myTable; -- возвращаем параметры из файла
	end
	return nil
end

Теперь вызываем функцию loadSettings, получаем данные из файла и присваиваем значения нашим переменным.

setting = loadSettings("settings.json"); -- загружаем параметры из файла
	
if (setting) then
	weight		= setting.weight;
	height 		= setting.height;
	age		= setting.age;
	sex		= setting.sex;
	time		= setting.time;
	activity_index 	= setting.activity_index;
	activity_name	= setting.activity_name;
	activity_factor	= setting.activity_factor;
end

После загрузки параметров приложение должно вывести текст и изменить положение ползунков у слайдеров как показано на рисунке.

Вид приложения после загрузки параметров

Вид приложения после загрузки параметров

Сохранение параметров

Для сохранения всех параметров напишем свою функцию saveSettings, похожую по своей структуре на предыдущую loadSettings.

-- Сохраняем параметры в файл
function saveSettings(t, filename)
	local path = system.pathForFile(filename, system.ResourceDirectory);
	local file = io.open(path, "w");
	if (file) then
		local contents = json.encode(t);
		file:write(contents);
		io.close(file);
		return true
	else
		return false
	end
end

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

settings = {};
settings.weight = weight;
settings.height = height;
settings.age = age;
settings.sex = sex;
settings.time = time;
settings.activity_index = activity_index;
settings.activity_name = activity_name;
settings.activity_factor = activity_factor;
saveSettings(settings, "settings.json");
Код самой функции размещаем внутри result.lua, соответственно, сохраняться все параметры будут только после того, как пользователь нажал на кнопку для получения результатов. Если изменены начальные данные, например, вес и рост, а приложение закрылось, то ничего не сохранится.

При сохранении файла в эмуляторе под Windows наблюдается неприятный баг — окно с выводом результатов закрывается самостоятельно. Само приложение работает корректно, сохраняет и загружает данные без всяких нареканий.

См. также

Руководство по применению формата JSON в Corona

http://coronalabs.com/blog/2011/08/03/tutorial-exploring-json-usage-in-corona/

Автор: Влад Мержевич
Последнее изменение: 04.08.2023