День пятнадцатый. Изолированное хранилище

Вступление

Как я и обещал, сегодня поговорим об изолированном хранилище (Isolated Storage). Иногда где-то нужно хранить используемую информацию, например, настройки программы или заметки о том, что вы делали прошлым летом. Windows Phone 7 не предоставляет доступа к своей файловой системе и в ее составе нет Проводника или редактора реестра для работы с настройками. Вместо этого используется изолированное хранилище.

Что такое Isolated Storage

Понятие изолированного хранилища не ново для разработчика. Данный механизм присутствовал в Silverlight со второй версии. Основная особенность изолированного хранилища, как видно из названия, - хранение данных или файлов на локальной файловой системе. Причем доступ к данным имеет только программа, которая поместила туда эти данные. Поэтому хранилище и называется изолированным. Если у вас есть две программы, и вы хотите, чтобы они обращались к одним и тем же данным, то вам следует присмотреться к "облачным" технологиям, о которых так много говорят сейчас. Изолированное хранилище не позволяет делиться своим данными между несколькими программами.

Для организации механизма хранения данных в Windows Phone 7 используется следующий набор объектов:

  • System.IO.IsolatedStorage.IsolatedStorageSettings – предоставляет доступ к словарю (ключ-значение) настроек для текущего хранилища (Isolated Settings Storage);
  • System.IO.IsolatedStorage.IsolatedStorageFile – позволяет получить доступ к хранилищу данных(Isolate File Storage);
  • System.IO.IsolatedStorage.IsolatedFileStream – позволяет получить доступ к содержимому файла в хранилище (Isolate File Storage);
  • System.IO.IsolatedStorage.IsolatedStorageException – исключение, возникающее при ошибках в работе с хранилищем

Настройки или файлы

Isolated Storage предполагает, что для каждого приложения существует изолированная среда для хранения данных. Приложения не могут получать доступ к хранилищу других приложений (в основном из соображений безопасности). Само хранилище при этом разделяется на две части:

  • Isolated Settings Storage;
  • Isolated File Storage

Хранилище Isolated Settings Storage предназначено для хранения настроек приложения. Хранение настроек осуществляется в специальном словаре (ключ-значение) и очень похоже на то, как работают аналогичные механизмы в настольной платформе.

Хранилище Isolated File Storage предназначено для хранения различных данных в виде файлов и папок. Таким образом вы можете структурировать хранилище, используя разбиение на папки. Фактически, это – некоторый доступ к файловой системе изолированного хранилища.

Ниже приведена иллюстрация на данную тему (взято с MSDN).

Хранение настроек (IsolatedStorageSettings)

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

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


using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Microsoft.Phone.Controls;
using System.IO.IsolatedStorage;

namespace Day15_IsolatedStorage
{
	public partial class MainPage : PhoneApplicationPage
	{
		IsolatedStorageSettings settings = IsolatedStorageSettings.ApplicationSettings;
		
		// Constructor
		public MainPage()
		{
			InitializeComponent();
			InitializeSettings();
		}

		private void InitializeSettings()
		{
			if (settings.Contains("emailFlag"))
			{
				EmailFlag.IsChecked = (bool)settings["emailFlag"];
			}
			else settings.Add("emailFlag", false);
		}

		private void EmailFlag_Unchecked(object sender, RoutedEventArgs e)
		{
			settings["emailFlag"] = false;
		}

		private void EmailFlag_Checked(object sender, RoutedEventArgs e)
		{
			settings["emailFlag"] = true;
		}
	}
}

Так, например, можно написать несложный код по подсчету количества запусков приложения и отображения этой информации пользователю. Для этого добавим на форму элемент TextBlock и будем инкрементировать счетчик при каждом запуске приложения. Эту логику можно поместить, например, в конструктор.


using System.IO.IsolatedStorage;

public MainPage()
{
    InitializeComponent()
    
    int count = 0;
    
    if (IsolatedStorageSettings.ApplicationSettings.Contains("count") == true)
    {
        count = (int)IsolatedStorageSettings.ApplicationSettings["count"];
    }
    
    count++;
    IsolatedStorageSettings.ApplicationSettings["count"] = count;
    IsolatedStorageSettings.ApplicationSettings.Save();
    
    textBlock1.Text = count.ToString();
}

Обратите внимание, что изменение настроек приложения также выполняется достаточно просто. Для этого следует изменить нужный ключ и вызвать метод Save.


// Сохраняем некое число
System.IO.IsolatedStorage.IsolatedStorageSettings.ApplicationSettings["count"] = count;
System.IO.IsolatedStorage.IsolatedStorageSettings.ApplicationSettings.Save();

Как видите, ничего сложного. Необходимо только запомнить несколько вещей:

  • Чтобы избежать ошибок при попытке извлечь несуществующие данные, всегда проверяйте наличие свойства Contains.
  • Вы можете сохранять данные любого типа. В нашем примере сохранялось значение типа Boolean. Но вы можете сохранять любой объект.
  • Необходимо использовать приведение типов при излечении данных. Изолированное хранилище хранит ваши данные, но не хранит тип данных.
  • Установка значения через settings.Add() не обязательно, вы можете просто присвоить значение нужной настройке. В первом примере используется данный прием, чтобы вы знали о нем.

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

Хранение файлов (IsolatedStorageFile)

Для доступа к файловому хранилищу используется класс IsolatedStorageFile и вы можете хранить настоящие файлы на устройстве. Обратившись к его статическому методу GetUserStoreForApplication можно получить доступ к объекту, предоставляющему всевозможные методы для работы с файлами и папками:

  • GetDirectoryNames – позволяет получить список всех папок в заданном контексте;
  • GetFileNames – позволяет получить список всех файлов в заданном контексте;
  • CreateDirectory – позволяет создать папку;
  • DeleteDirectory – позволяет удалить папку;
  • DirectoryExists – позволяет проверить наличие папки;
  • CreateFile - позволяет создать файл;/li>
  • OpenFile – позволяет открыть файл для чтения и/или изменения;
  • DeleteFile – позволяет удалить файл;
  • FileExists – позволяет проверить наличие файла.

Как видно, для работы с файлом используется метод OpenFile. Этот файл возвращает поток, с которым можно работать так, как мы это делаем обычно (например, используя StreamReader/StreamWriter). Например, код для записи информации в файл будет выглядеть следующим образом.

Мы создадим текстовый файл в подпапке, а затем получим содержимое из текстового файла. У нас есть возможность создавать и удалять папки, подпапки и файлы. Для этого мы создаем новый объект IsolatedStorageFile, а затем записываем его на диск при помощи IsolatedStorageFileStream. В примете имеются комментарии, чтобы вам было понятнее. У нас есть два события, одно из них сохраняет файл, второе - читает из файла:


using System.IO.IsolatedStorage;
using System.IO;

private void SaveButton_Click(object sender, RoutedEventArgs e)
{
	//Obtain a virtual store for application
	IsolatedStorageFile fileStorage = IsolatedStorageFile.GetUserStoreForApplication();

	//Create new subdirectory
	fileStorage.CreateDirectory("textFiles");

	//Create a new StreamWriter, to write the file to the specified location.
	StreamWriter fileWriter = new StreamWriter(new IsolatedStorageFileStream("textFiles\\newText.txt", FileMode.OpenOrCreate, fileStorage));
	//Write the contents of our TextBox to the file.
	fileWriter.WriteLine(writeText.Text);
	//Close the StreamWriter.
	fileWriter.Close();
}

private void GetButton_Click(object sender, RoutedEventArgs e)
{
	//Obtain a virtual store for application
	IsolatedStorageFile fileStorage = IsolatedStorageFile.GetUserStoreForApplication();
	//Create a new StreamReader
	StreamReader fileReader = null;

	try
	{
		//Read the file from the specified location.
		fileReader = new StreamReader(new IsolatedStorageFileStream("textFiles\\newText.txt", FileMode.Open, fileStorage));
		//Read the contents of the file (the only line we created).
		string textFile = fileReader.ReadLine();

		//Write the contents of the file to the TextBlock on the page.
		viewText.Text = textFile;
		fileReader.Close();
	}
	catch
	{
		//If they click the view button first, we need to handle the fact that the file hasn't been created yet.
		viewText.Text = "Need to create directory and the file first.";
	}
}

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

Дополнительная информация

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

При удалении приложения из устройства, данные из изолированного хранилища также удаляются.

Заключение

Сегодня мы познакомились с двумя способами хранения данных из приложения, которые используются в Windows Phone 7: IsolatedStorageSettings и IsolatedStorageFile. Как видно, на это не требуется много усилий, а работа с хранилищем очень похожа на аналогичные операции в настольном Silverilght. Тем не менее, по сравнению с хранилищем в Silverilght, хранилище в Windows Phone не имеет ограничений, связанных с объемом хранимой информации. Успехов вам в создании ваших мобильных приложений!

Реклама