Изолированное хранилище для файлов и папок
Чтобы разобраться, с основами работы с изолированным хранилищем, добавим в наше приложение возможность сохранять полученную RSS ленту между запусками и запрашивать сервер тогда, когда у нас лента не загружена или пользователь попросил обновить ленту.
Как обычно, сначала добавим в секцию using дополнительную директивы:
using System.IO.IsolatedStorage;
using System.IO;
Добавим функции сохранения и считывания файла. Для этого сначала определим константу с именем файла:
const string RSSFileName = "rss.xml";
Далее определим функции считывания и записи файла в строку из изолированного хранилища:
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;
}
Для удобства добавления функционала также определим функцию, которая будет проверять наличие файла в изолированном хранилище.
bool IsRSSExist()
{
IsolatedStorageFile rssFileStorage =
IsolatedStorageFile.GetUserStoreForApplication();
return rssFileStorage.FileExists(RSSFileName);
}
Теперь выделим разбор полученного результата и связывание данных в отдельную функцию:
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;
}
И добавим сохранение полученного результата в обработчик завершения загрузки:
void client_DownloadStringCompleted(object sender,
DownloadStringCompletedEventArgs e)
{
if (e.Error == null)
{
RSSString = e.Result;
ParseRSSAndBindData(RSSString);
SaveRSSToIsolatedStorage(RSSString);
}
}
Осталось модифицировать функцию LoadRSS():
private void LoadRSS()
{
if (IsRSSExist())
{
RSSString = LoadRSSFromIsolatedStorage();
ParseRSSAndBindData(RSSString);
}
else
{
RequestRSS();
}
}
Где RequestRSS() – это наша старая функция LoadRSS():
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 и определить в нем таблицы. Это создаст базовую инфраструктуру для использования локальной базы данных на устройстве.
Для дальнейшего изучения работы с базой данных, можно посмотреть простой пошаговый пример создания приложения для работы с базой данных можно посмотреть здесь: http://msdn.microsoft.com/en-us/library/hh202876(v=VS.92).aspx
Более сложный пример приложения, работающего с локальной базой данных и сделанного в паттерне MVVM можно скачать здесь: http://go.microsoft.com/fwlink/?LinkId=219066, краткое пояснение к проекту доступно по следующей ссылке http://msdn.microsoft.com/en-us/library/hh286405(v=VS.92).aspx