Локальное хранение данных




На платформе Windows Phone приложение может хранить данные тремя способами:

• настройки: данные сохраняются как пары ключ/значение, используется класс IsolatedStorageSettings;

• файлы и папкисохраняются на устройстве с использованием класса IsolatedStorageFile;

• реляционные данныесохраняются в локальной базе данных с использованием технологии LINQ в SQL.

Изолированное хранилище для настроек

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

Предназначено собственно для хранения настроек приложения, один экземпляр для одного приложения, создаётся при первом обращении.

Изолированное хранилище для файлов и папок

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

Как обычно, сначала добавим в секцию using дополнительную директивы:

using System.IO.IsolatedStorage;

using System.IO;

Добавим функции сохранения и считывания файла. Для этого сначала определим константу с именем файла:

const string RSSFileName = "rss.xml";

Далее определим функции считывания и записи файла в строку из изолированного хранилища:

Листинг 10

void SaveRSSToIsolatedStorage(string RSSText)

{

IsolatedStorageFile rssFileStorage =

IsolatedStorageFile.GetUserStoreForApplication();

IsolatedStorageFileStream rssFileStream =

rssFileStorage.CreateFile(RSSFileName);

StreamWriter sw = new StreamWriter

(rssFileStream);

sw.Write(RSSText);

sw.Close();

rssFileStream.Close();

}

string LoadRSSFromIsolatedStorage()

{

IsolatedStorageFile rssFileStorage =

IsolatedStorageFile.GetUserStoreForApplication();

IsolatedStorageFileStream rssFileStream =

rssFileStorage.OpenFile(RSSFileName,

System.IO.FileMode.Open);

StreamReader sr = new StreamReader

(rssFileStream);

string RSS = sr.ReadToEnd();

sr.Close();

rssFileStream.Close();

return RSS;

}

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

 

Листинг 11

bool IsRSSExist()

{

IsolatedStorageFile rssFileStorage =

IsolatedStorageFile.GetUserStoreForApplication();

return rssFileStorage.FileExists(RSSFileName);

}

Теперь выделим разбор полученного результата и связывание данных в отдельную функцию:

Листинг 12

void ParseRSSAndBindData(string RSSText)

{

XElement twitterElements = XElement.Parse(RSSText);

var postList =

from tweet in twitterElements.Descendants("item")

select new PostMessage

{

title = tweet.Element("title").Value,

pubDate = tweet.Element("pubDate").Value,

link = tweet.Element("link").Value

};

RssList.ItemsSource = postList;

}

И добавим сохранение полученного результата в обработчик завершения загрузки:

Листинг 13

void client_DownloadStringCompleted(object sender,

DownloadStringCompletedEventArgs e)

{

if (e.Error == null)

{

RSSString = e.Result;

ParseRSSAndBindData(RSSString);

SaveRSSToIsolatedStorage(RSSString);

}

}

Осталось модифицировать функцию LoadRSS():

Листинг 14

private void LoadRSS()

{

if (IsRSSExist())

{

RSSString = LoadRSSFromIsolatedStorage();

ParseRSSAndBindData(RSSString);

}

Else

{

RequestRSS();

}

}

Где RequestRSS() – это наша старая функция LoadRSS():

Листинг 15

private void RequestRSS()

{

WebClient client = new WebClient();

client.DownloadStringCompleted += new

DownloadStringCompletedEventHandler(

client_DownloadStringCompleted);

client.DownloadStringAsync(new Uri(RSS));

}

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

Самостоятельно измените интерфейс, добавив кнопку для обновления и дописав необходимый код. А что, если в реальности мы не хотим замусоривать изолированное хранилище файлами, которые содержат лишнюю информацию, а также мы хотим выполнять анализ полученных данных, путем запросов к ним, тем или иным образом. Тут на помощь нам может прийти локальное хранилище реляционных данных. Для того, чтобы им воспользоваться необходимо добавить в решение ссылку на библиотеку System.Data.Linq, а также добавить блок using следующие директивы:

using System.Data.Linq;

using System.Data.Linq.Mapping;

using System.ComponentModel;

using System.Collections.ObjectModel;

Далее необходимо определить классы, которое будут представлять сущности для хранения в локальной базе, отаттрибутировать их соответсвующим образом ([Table] и [Column] с параметрами) и реализовать 2 интерфейса INotifyPropertyChanged, INotifyPropertyChanging, чтобы минимизировать использование памяти.

Затем необходимо определить свой класс контекста данных, унаследованный от DataContext и определить в нем таблицы. Это создаст базовую инфраструктуру для использования локальной базы данных на устройстве.

 

Список литературы

1. Разработка мобильных приложений(WikiTaxi)

2. Мобильные приложения(WikiTaxi)

3. Human Interface(WikiTaxi)

4. Мобильные интерфейсы(WikiTaxi)

5. Нативные приложения(WikiTaxi)

6. Разработка нативных приложений(WikiTaxi)

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-02-16 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: