Очень часто в приложении или игре возникает необходимость сохранить какую-либо информацию. К примеру, для игры это может быть таблица рекордов или текущий уровень, чтобы при последующем запуске игры, пользователь мог продолжить играть с прошлого достигнутого уровня; для приложения - это могут быть какие-то настройки и т.п. На компьютере в этих целях обычно пользуются записью в файл или в реестр. В мобильном телефоне нет реестра, да и доступа к файловой системе тоже во многих случаях нет, по-этому эти способы нам не подходят. Специально для этих целей в телефоне предусмотрена область памяти на флеш карте, названная Хранилищем Записей (Record Store или просто RMS).
В компьютере записываемая информация никак не защищена. Любые данные, записанные в реестр или в файл, могут быть открыты и изменены другой программой. В телефоне же это не так. Каждая игра или программа имеет своё Хранилище Записей и другая программа не может получить к нему доступ ни на чтение ни на изменение данных. По-этому вы можете смело хранить в Хранилище практически любую информацию и при этом не волноваться за её сохранность и безопасность.
Итак, вы усвоили, что каждое мобильное приложение имеет своё отдельное Хранилище Записей. Давайте разберемся подробнее, как же именно хранится там информация. Каждое Хранилище Записей состоит из одного или множества разделов, которые различаются по именам. То есть, к примеру, игра может иметь 2 раздела: records (в котором хранится таблица рекордов) и level (где хранится текущий уровень игры). Как вы понимаете, все названия разделов должны быть уникальными и состоять только из латинских букв или цифр. Максимальная длина имени раздела - 32 символа. Для того чтобы открыть раздел Хранилища служит функция OpenRecordStore. Эта функция принимает всего один аргумент - название раздела, и возвращает объект типа RecordStore. Если при попытке открытия раздела окажется, что раздела с таким именем нет, то ничего страшного не произойдет. Просто создастся новый пустой раздел с данным именем. Чтобы закрыть раздел Хранилища записей нужно вызвать процедуру CloseRecordStore. Чтобы удалить раздел в Хранилище Записей (и всю информацию в нем), используйте процедуру DeleteRecordStore.
Итак, движемся дальше. Каждый раздел в Хранилище Записей имеет собственно записи, которые выглядят в виде обычных текстовых строк. Каждая такая строка имеет свой номер. Это напоминает хранение строк в массиве. Тут тоже наблюдается отличие от компьютера, где программа может хранить информацию в бинарном или текстовом формате, тут же используется только текст. Вы можете узнать количество записей в вашем хранилище, воспользовавшись функцией GetRecordStoreSize. Для чтения записи из хранилища, используется функция ReadRecordStoreEntry, которая принимает 2 аргумента: объект типа RecordStore и номер записи, а возвращает строку текста, которая хранится под данным номером. Чтобы добавить новую запись в раздел хранилища, используют функцию AddRecordStoreEntry, которая возвращает номер, под которым была сохранена данная запись. Функция GetRecordStoreNextId возвращает следующий незанятый номер записи, который будет использован в случае добавления записи функцией AddRecordStoreEntry. Чтобы изменить строку, хранящуюся в разделе, используйте процедуру ModifyRecordStoreEntry. Ну и наконец, чтобы удалить запись из раздела нужно вызвать процедуру DeleteRecordStoreEntry.
Пример: Первая запись в хранилище всегда имеет номер 1. Вызов функции AddRecordStoreEntry добавит запись и присвоит ей номер 2. Следующей записи присвоится номер 3, и т.п. Если вы удалите запись под номером 1, и после этого добавите запись функцией AddRecordStoreEntry, новая запись будет сохранена под номером 4, а запись под номером 1 так и останется пустой (то есть, другими словами, дефрагментация записей в хранилище не делается). Вызов функции GetRecordStoreNextId вернет 5 (номер следующей незанятой записи), и GetRecordStoreSize вернет 3 (общее количество записей), потому что после удаления первой записи, в разделе осталось всего 3 из 4 записей.
Приведенный ниже пример кода подсчитывает и сохраняет в Хранилище Записей количество запусков программы (что может быть использовано, например, для ограничения количества запусков в демонстрационных версиях приложения):
var rs : RecordStore;
countStr : string;
countInt : integer;
index : integer;
nextId : integer;
begin
// открываем раздел хранилища записей
rs := OpenRecordStore('Count');
nextId := GetRecordStoreNextId(rs);
// если это первый запуск программы - добавляем запись в хранилище
if nextId = 1 then
index := AddRecordStoreEntry(rs, '0'); // устанавливаем счетчик в 0
// читаем содержимое счетчика
countStr := ReadRecordStoreEntry(rs, 1);
// увеличиваем значение счетчика на 1
countInt := StringToInteger(countStr) + 1;
countStr := IntegerToString(countInt);
// записываем измененное значение счетчика назад в хранилище
ModifyRecordStoreEntry(rs, countStr, 1);
// закрываем раздел хранилища записей
CloseRecordStore(rs);
// отображаем значение счетчика
ShowForm;
index := FormAddString('Ты уже запускал эту программу ' + countStr + ' раз.');
AddCommand(CreateCommand('Выход', CM_EXIT, 1));
repeat Delay(100) until GetClickedCommand <> EmptyCommand;
end. |
ПРИМЕЧАНИЕ: MIDlet Pascal не умеет корректно сохранять записи на русском языке. По-этому для хранения таких записей нужно воспользоваться специальной библиотекой или перекодировать строки текста в формат Win-1251, а после чтения их, перекодировать строки обратно в формат UTF-8. Также следует помнить, что операции с флеш памятью довольно медленные, что может привести к заметным задержкам в приложении при чтении/записи больших объемов информации.
|