В WinRT изменилась работа с данными и файловой системой и она немного отличается как от настольного .
NET, так и от Silverlight. Для доступа к пользовательским файлам в системе нужны соответствующие разрешения и необходимо использовать контракты и расширения для работы с файлами (о которых речь пойдет в отдельной статье).
Однако каждое приложение имеет доступ к изолированному хранилищу для хранения служебных данных и настроек.
Все необходимое для хранения данных находится в пространстве имен Windows.Storage объекта ApplicationData. В этой статье мы рассмотрим работу со следующими объектами: Хранение простых данных в LocalSettings и RoamingSettings. (Хранение простых данных) Хранение двоичных данных в LocalFolder, TemporaryFolder, RoamingFolder. (Хранение данных в файловой системе) Особенности работы с RoamingSettings и RoamingFolder (Хранение данных в облаке.
Синхронизация данных между устройствами).
Версионирование данных в роуминге.
Прямой доступ к данным через Uri. В следующий части работа с базой данных будет рассмотрена.
Официальный пример работы с локальными данными можно скачать по адресу: code.msdn.microsoft.com/windowsapps/ApplicationData-sample-fb043eb2 В этой статье будет рассмотрен пример работы с локальными данными FileStorage.zip.
1. Хранение простых данных в LocalSettings и RoamingSettings.
Работа с LocalSettings и RoamingSettings идентична.Об особенностях RoamingSettings речь пойдет ниже.
Эти объекты в первую очередь предназначены для хранения простых данных простых типов.
Он может хранить такие данные, как string, bool, int, float и т. д. Эти объекты удобно использовать для хранения таких настроек, как уровень громкости звука и т. д. API реализован очень просто.
Следующий код сохраняет текст с ключом «customKey»:
Считать данные так же просто, как и сохранить их (поскольку значения типа object необходимо преобразовать в исходный тип):ApplicationData.Current.LocalSettings.Values["customKey"] = "mytext";
var customText = (string) ApplicationData.Current.LocalSettings.Values["customKey"];
Также желательно проверять наличие ключа перед его получением, чтобы не получить ошибку NullReferenceException для типов данных значений (bool, int, float и т. д.).
настройки вар = ApplicationData.Current.LocalSettings; если (settings.Values.ContainsKey("pageNumber")) { var Number = (int)settings.Values[“pageNumber”]; } Часто нам необходимо хранить более сложные типы данных и/или двоичные данные.
В этом случае мы можем использовать объекты xFolder.
2. Хранение двоичных данных в LocalFolder, TemporaryFolder, RoamingFolder.
Объекты xFolder предназначены для хранения данных в файловой системе.Работа с ними практически идентична с небольшими особенностями.
LocalFolder предназначен для хранения служебных файлов, необходимых приложению, например базы данных или данных, загруженных из сети, которые должны находиться на клиенте.
TemproryFolder хорош для временных данных.
Например, для клиентского приложения социальной сети эта папка хорошо подходит для кэширования фотографий.
RoamingFolder, как и RoamingSettings, можно использовать для данных, которые необходимо синхронизировать между устройствами и/или хранить в облаке.
О работе с ними будет подробно рассказано далее, но они могут хранить небольшие данные (до 100 Кб).
Для работы с файлами вы также можете использовать методы объекта FileIO, упрощающие работу с данными.
Например, следующий код создает текстовый файл my.txt с содержимым Hello! Мир! var storageFolder = ApplicationData.Current.LocalFolder;
var file = await storageFolder.CreateFileAsync("my.txt", CreationCollisionOption.ReplaceExisting);
await FileIO.WriteTextAsync(file, "Hello! World!");
Аналогично вы можете прочитать текстовый файл: var storageFolder = ApplicationData.Current.LocalFolder;
var file = await storageFolder.GetFileAsync("my.txt");
var text = await FileIO.ReadTextAsync(file);
В тех случаях, когда нам нужно хранить сложные типы данных, мы можем использовать какой-нибудь сериализатор.
Например, DataContractSerializer (в пространстве имен System.Runtime.Serialization) или стороннюю библиотеку Json.net.
В прикрепленном к статье примере есть пример сохранения и чтения книги с помощью библиотеки Json.NET: public static async Task Save(Book book)
{
var serializedString = JsonConvert.SerializeObject(book);
var storageFolder = ApplicationData.Current.LocalFolder;
var file = await storageFolder.CreateFileAsync("book.dat", CreationCollisionOption.ReplaceExisting);
await FileIO.WriteTextAsync(file, serializedString);
}
public static async Task<Book> GetBook()
{
var file = await ApplicationData.Current.LocalFolder.GetFileAsync("book.dat");
var serializedString = await FileIO.ReadTextAsync(file);
return await JsonConvert.DeserializeObjectAsync<Book>(serializedString);
}
Теперь, когда мы рассмотрели работу с «Настройки» и «Папка», мы можем рассмотреть возможности работы с данными в роуминге.
3. Особенности работы с RoamingSettings и RoamingFolder
RoamingSettings и RoamingFolder предназначены для хранения небольших объемов данных в облаке.Не следует пытаться сохранить всю базу данных вашего приложения.
Например, если у вас есть приложение для чтения книг, не стоит пытаться хранить в нем тексты книг; вместо этого вы можете сохранить последний открытый файл и страницу, которую пользователь читает в данный момент. Для игры вы можете хранить текущий прогресс игры (например, информацию о разблокированных уровнях).
Эти объекты предоставляют бесплатную возможность сохранять игровой прогресс не только между переустановками приложения, но и между разными устройствами, без необходимости содержания собственной серверной инфраструктуры! Кроме того, как уже говорилось выше, поскольку данные, хранящиеся в этих объектах, сохраняются между установками приложений, вам следует тщательно продумывать логику работы с данными в этих хранилищах, поскольку если ваше приложение, например, выйдет из строя из-за неверных значений в эти объекты, он будет продолжать падать даже после переустановки.
Что может привести к тому, что пользователь потеряет всякую возможность работать с вашим приложением.
3.1. Ограничения
Объем доступных данных ограничен и его значение можно получить из свойства RoamingStorageQuota (значение указывается в килобайтах — по умолчанию 100 Кб) ApplicationData.Current.RoamingStorageQuota
Также при сохранении данных в RoamingFolder нельзя использовать пробелы в именах файлов.
3.2. Время синхронизации
При разработке приложения, работающего через Roaming Folder, необходимо учитывать, что время синхронизации данных между устройствами составляет около 10-15 минут. Однако существует служебный ключ для RoamingSettings, который следует использовать для данных с высоким приоритетом синхронизации: HighPriority
Время синхронизации данных по этому ключу где-то 15-30 секунд.
ApplicationData.Current.LocalSettings.Values["HighPriority"] = "high priority data";
Во время выполнения приложения вы также можете перехватить событие DataChanged: изменение данных.
ApplicationData.Current.DataChanged += Current_DataChanged;
Поскольку событие не вызывается в потоке пользовательского интерфейса, обновление пользовательского интерфейса должно выполняться через диспетчер: void Current_DataChanged(ApplicationData sender, object args)
{
Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
MyTextBox.Text = (string)ApplicationData.Current.RoamingSettings.Values["HighPriority"];
});
}
Для отладки приложения мы можем вызвать ApplicationData.Current.SignalDataChanged(); который вызовет событие DataChanged.
Что делать, если новая версия приложения требует новой структуры данных, несовместимой со структурой данных предыдущего приложения?
4. Версионирование данных в роуминге.
Любое приложение, которое продолжает развиваться с течением времени, требует новой структуры данных.
Для данных, которые хранятся локально, мы можем предоставить собственные механизмы контроля версий и обновления данных.
При роуминге данных потенциальная проблема заключается в том, что, хотя новые приложения могут предоставлять логику для обработки данных старого формата, уже выпущенные и работающие приложения не смогут обрабатывать данные нового формата.
WinRT предоставляет готовый API для разделения данных на разные версии.
Роуминговые данные в приложении будут получать данные только от версий с одинаковым номером.
Событие DataChanged срабатывает только в приложениях, в которых установлена идентичная версия данных.
Текущую версию можно получить из свойства ApplicationData.Version: ApplicationData.Current.Version
Номер версии по умолчанию — 0.
Настоятельно рекомендуется изначально предусмотреть возможность изменений в будущем и начинать с версии 1, а не с версии по умолчанию.
Вы можете установить новую версию данных с помощью метода SetVersionAsync: await ApplicationData.Current.SetVersionAsync(versinoNumber, UpgradeToVersionHandler);
TextBlockDataVersion.Text = ApplicationData.Current.Version.ToString();
Где:
versionNumber — целое значение номера версии
UpgradeToVersionHandler – обработчик обновления данных: private void UpgradeToVersionHandler(SetVersionRequest setversionrequest)
{
var defferal = setversionrequest.GetDeferral();
if (setversionrequest.DesiredVersion > setversionrequest.CurrentVersion)
{
//UpgradeCodeFromOldToNewVersion();
}
defferal.Complete();
}
Поскольку при установке новой версии приложения мы также должны обновить данные, мы должны использовать метод GetDefferral(), чтобы приложение не закрывалось в момент обновления данных.
Как и при роуминге данных, версия данных сохраняется даже после переустановки приложения.
Номер версии не синхронизируется между устройствами (Каждое устройство имеет свой номер версии).
Часто приложениям требуется прямой доступ к данным в папке.
В следующем разделе мы рассмотрим, как это можно сделать.
5. Прямой доступ к данным через Uri и Path.
WinRT представила префиксы для прямого доступа к данным.
Для этого можно использовать следующие префиксы: мс-приложение:/// – доступ к файлам, включенным в проект. ms-appdata:///local/ – доступ к файлам, сохраненным в папке LocalFolder ms-appdata:///роуминг/ — доступ к файлам, сохраненным в папке RoamingFolder ms-appdata:///temp/ — доступ к файлам в папке TemporaryFolder
В официальных примерах есть пример доступа к картинкам по этим префиксам: LocalImage.Source = new BitmapImage(new Uri(" ms-appdata:///local/appDataLocal.png "));
RoamingImage.Source = new BitmapImage(new Uri(" ms-appdata:///roaming/appDataRoaming.png "));
TempImage.Source = new BitmapImage(new Uri(" ms-appdata:///temp/appDataTemp.png "));
При необходимости мы также можем получить доступ к папке, в которой хранится приложение.
Путь к папке можно получить из свойства Path для всех объектов xFolder. Например, путь к локальной папке можно получить из свойства: ApplicationData.Current.LocalFolder.Path
В данном случае путь к папке выглядит примерно так:
c:\users\UserName\AppData\Local\Packages\e965c8d4-0dff-4f2e-8340-24041aabca05_5mvwcwnjebzdj\LocalState\
Где
UserName – имя пользователя в системе
e965c8d4-0dff-4f2e-8340-24041aabca05 – идентификатор приложения.
Соответственно, полный путь к файлу в этой папке можно получить либо простым объединением строк, либо воспользовавшись вспомогательным методом Path.Combine (пространство имен System.IO).
Итак, путь к файлу my.txt будет выглядеть так: var fullPath=Path.Combine(ApplicationData.Current.RoamingFolder.Path, "my.txt");
Прямой доступ к файлу может быть удобно использовать при работе с базами данных для указания пути к файлу с базой данных, работу с которым мы рассмотрим в следующей части.
Полученные результаты
Как мы видим, Microsoft существенно упростила возможность работы с данными, предоставив готовые инструменты для хранения локальных и временных данных и предоставив простой и бесплатный механизм синхронизации состояния приложений между устройствами (который можно использовать в качестве облачного резервного копирования для небольшие данные при необходимости).Теперь вы можете предоставить пользователям возможность бесплатно сохранять любимую игру.
:) Теги: #WinRT #windows 8 #C++ #.
NET #C++
-
Jetking — Лучший Институт Для Обучения
19 Oct, 24 -
Борьба За Трафик В Деловых Газетах
19 Oct, 24 -
Что Такое Коворкинг От Banker!
19 Oct, 24 -
Как Мы Запускали Программу Deep Learning
19 Oct, 24 -
Реклама, Которая Не Уважает Пользователей
19 Oct, 24