Основы разработки приложений для мобильных устройств на платформе Windows Phone

Изолированное хранилище

Показывать лекцию целиком

Основные теоретические сведения

Практически в любом приложении требуется хранить данные, которые приложение использует при работе. Приложение Silverlight должно сохранять настройки и информацию, с которой работает пользователь, игре XNA требуется хранить информацию о достижениях игрока, список рекордов и игровые настройки. Программы Windows Phone могут использовать изолированное хранилище для хранения подобной информации. Хранилище называют "изолированным", потому что приложение не может получить доступ к данным, которые сохраняет другое приложение, в отличие от компьютеров под управлением Windows, в которых любая программа может получить доступ к любому файлу в системе.

В изолированном хранилище можно сохранять большие объёмы данных вплоть до максимально доступного объёма памяти для хранения данных в телефоне. В устройствах Windows Phone имеется минимум 8 Гб встроенного хранилища, которое совместно используется программами для работы с мультимедиа файлами (музыка, изображения и видео) и всеми приложениями в устройстве.

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

Изолированное хранилище можно использовать точно так же, как и файловую систему. Единственная разница заключается в способе подключения приложения к хранилищу. Однако, после того как программа подключится к файловой системе, она может создавать потоки для передачи данных в файлы и даже использовать папки для создания структурированного файлового хранилища. Так программа может сохранять большие объёмы данных.

Классы для работы с файлами изолированного хранилища

Необходимые классы для работы с изолированным хранилищем находятся в пространствах имён System.IO и System.IO.IsolatedStorage. В последнем описаны классы IsolatedStorageFile и IsolatedStorageFileStream, которые позволяют работать с файлами изолированного хранилища.

Класс IsolatedStorageFile содержит следующие методы для работы с файловой системой:

  • GetUserStoreForApplication — получает изолированное хранение с областью действия пользователя, соответствующее вызову удостоверения приложения кода;
  • Close — закрывает ранее открытое хранилище;
  • CreateDirectory — создает в области ограниченного действия изолированного хранения папку;
  • MoveDirectory — перемещает указанный каталог и его содержимое в новое расположение;
  • DeleteDirectory — удаляет из области ограниченного действия изолированного хранилища папку;
  • DirectoryExists — определяет, указывает ли заданный путь на существующий каталог в изолированном хранилище;
  • GetDirectoryNames — перечисляет каталоги в корневой папке изолированного хранилища;
  • CreateFile — создает файл в изолированном хранилище;
  • CopyFile — копирует существующий файл в новый файл;
  • OpenFile — открывает файл в заданном режиме, с заданным уровнем доступа для чтения и записи и с разрешением на совместный доступ;
  • MoveFile — перемещает указанный файл в новое расположение и позволяет указать для файла новое имя;
  • DeleteFile — удаляет из области ограниченного действия изолированного хранилища файл;
  • GetFileNames — перечисляет имена файлов в корневой папке изолированного хранилища;
  • FileExists — определяет, указывает ли заданный путь на существующий файл в изолированном хранилище;
  • GetCreationTime — возвращает дату и время создания заданного файла или каталога;
  • GetLastAccessTime — возвращает дату и время последнего обращения к указанному файлу или каталогу;
  • GetLastWriteTime — возвращает дату и время последней операции записи в указанный файл или каталог.
  • Работа с классом IsolatedStorageFileStream аналогична работе с другими потоками.

    Ниже представлены методы для сохранения строки в файле и для загрузки строки из файла.

    private void saveText(string filename, string text)
    {
        using (IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication())
        {
            using (IsolatedStorageFileStream rawStream = isf.CreateFile(filename))
            {
                StreamWriter writer = new StreamWriter(rawStream);
                writer.Write(text);
                writer.Close();
            }
        }
    }
    
    private bool loadText(string filename, out string result)
    {
        result = "";
        using (IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication())
        {
            if (isf.FileExists(filename))
            {
                try
                {
                    using (IsolatedStorageFileStream rawStream =
                        isf.OpenFile(filename, System.IO.FileMode.Open))
                    {
                        StreamReader reader = new StreamReader(rawStream);
                        result = reader.ReadToEnd();
                        reader.Close();
                    }
                }
                catch
                {
                    return false;
                }
            }
            else
            {
                return false;
            }
        }
        return true;
    }
    

    Метод saveText создаёт поток, связанный с указанным файлом в изолированном хранилище, и записывает в него текст. Потоки работают точно так же, как и в других программах на C#. В нашем случае метод создаёт объект StreamWriter, которому передаётся текст.

    Метод loadText возвращает значение false, если входной файл не найден, или при чтении файла возникает исключение. Метод ReadToEnd позволяет делать в программе многострочные текстовые записи.

    Классы для работы с хранилищем настроек приложения

    Часто программам нужно сохранить некоторые настройки, которые являются простыми значениями. В этом случае использовать файлы и потоки очень неудобно. Чтобы облегчить сохранение настроек, программа Windows Phone может использовать хранилище для настроек. Оно работает как словарь, который может сохранить любое количество пар "имя—значение" в изолированной области.

    В Windows Phone можно использовать класс IsolatedStorageSettings, который является словарём для хранения настроек в системе. Словарь настроек хранит коллекцию объектов и использует строку в качестве ключа.

    Можно изменить рассмотренные выше методы, добавив использование изолированного хранилища настроек:

    private void saveText(string filename, string text)
    {
        IsolatedStorageSettings isolatedStore =
            IsolatedStorageSettings.ApplicationSettings;
        isolatedStore.Remove(filename);
        isolatedStore.Add(filename, text);
        isolatedStore.Save();
    }
    

    Эта версия метода saveText использует имя файла в качестве ключа. Он удаляет запись с существующим ключом, значение которого является именем файла, и добавляет переданный текст в качестве нового элемента. Метод Remove вызывается для удаления элемента из словаря. Метод принимает в качестве параметра значение ключа элемента, который нужно удалить. Если элемента с таким ключом в словаре нет, метод Remove возвращает значение false, но в нашем примере это не имеет значения. После выполнения изменений в хранилище, необходимо вызвать метод Save для сохранения этих изменений.

    Метод loadText будет считывать значения из словаря настроек:

    private bool loadText(string filename, out string result)
    {
        IsolatedStorageSettings isolatedStore =
            IsolatedStorageSettings.ApplicationSettings;
        result = "";
        try
        {
            result = (string)isolatedStore[filename];
        }
        catch
        {
            return false;
        }
        return true;
    }
    

    Метод loadText выбирает запрошенный элемент из хранилища настроек. Его использование осложняется тем, что в отличие от класса Dictionary класс IsolatedStorageSettings не содержит метод ContainsKey, который используется для определения, есть ли в словаре данный элемент. Наш метод перехватывает исключение, которое генерируется, если элемент не найден, и возвращает значение false, чтобы указать, что такого элемента нет.

    Дополнительные материалы

    Сайт MSDN: http://msdn.microsoft.com/ru-ru/library/3ak841sy.

    Задание к работе

  • Откройте в Visual Studio созданный в предыдущей работе проект программы для Windows Phone.
  • Добавьте в программу возможность добавления и удаления элементов списка, сохранения списка в файле изолированного хранилища и его загрузки из файла при запуске программы.
  • Добавьте в программу возможность изменения параметров отображения страницы программы (размер шрифта текста заголовка программы, цвет фона и др.), их сохранения в хранилище приложения и применения при запуске программы.
  • Запустите программу и проверьте правильность её работы.
  • Составьте отчёт о проделанной работе. Включите в отчёт необходимые листинги программы.
  • Вернуться к учебному плану