Эта статья является 8-м днем в серии под названием « 31 день Windows 8» . Каждая из статей этой серии будет опубликована как для HTML5 / JS, так и для XAML / C # . Вы можете найти дополнительные ресурсы, загрузки и исходный код на нашем сайте .
В нескольких статьях этой серии мы упоминали, что хранение данных не только невероятно важно, но и то, что его очень легко сделать как локально для устройства, так и для роуминга на множестве различных устройств, которые может использовать пользователь.
Microsoft предлагает нам некоторые конкретные указания относительно того, когда следует использовать роуминг по сравнению с локальным хранилищем , но я дам вам краткое резюме, чтобы у вас была возможность прочитать его (поскольку мы оба знаем, что вы не нажимали эту ссылку) , Опять же, это рекомендации, поэтому вам не будет отказано в магазине за нарушение этих правил, но есть также ограничения по размеру и скорости передачи данных. Превышение этих значений не позволит вашему приложению фактически перемещать данные в течение определенного периода времени.
ДЕЛАТЬ
- Используйте роуминг для предпочтений и настройки . Любой выбор, который пользователь может сделать на каждой машине, которую он использует, должен быть перемещен. Это базовые настройки, такие как цветовые предпочтения, избранные актеры или публикация данных в Twitter.
- Используйте роуминг, чтобы позволить пользователям продолжить задачу. Мои любимые браузеры следуют за мной, или даже мои высокие оценки — это круто. Позволить мне продолжить писать это письмо (или сообщение в блоге), которое я так и не закончил? Даже лучше.
не надо
- Используйте роуминг для получения информации, которая является исключительно локальной. Это включает в себя такие вещи, как пути к файлам и другие данные, которые имеют смысл только для локального устройства.
- Не бродите по большим наборам данных. Существует квота, которую вы можете определить в коде , которая ограничивает размер вашего роумингового набора данных. Лучше всего перемещать настройки и небольшие файлы данных, как мы покажем в этой статье.
- Не используйте роуминг для мгновенной синхронизации или быстрого изменения данных. Windows контролирует, когда и как часто данные вашего приложения будут перемещаться, поэтому не рассчитывайте на мгновенную синхронизацию. Создайте собственный веб-сервис, если вам нужна такая надежность. Кроме того, не обновляйте данные роуминга постоянно. Например, вам не нужно постоянно перемещаться по текущему местоположению пользователя, вместо этого обновляйте его каждую минуту или около того. Вы по-прежнему обеспечите богатый опыт, не разрушая свою квоту.
Еще одна вещь, которую нужно помнить: способ передачи данных между устройствами управляется учетной записью Microsoft пользователя. Если они войдут на две машины с одинаковыми учетными данными и установят одно и то же приложение в обоих местах, ТО переместятся настройки и файлы роуминга. До этого ничего не происходит.
Теперь, когда я напугал вас никогда не использовать это, давайте посмотрим, как это делается. Существует два типа данных, которые можно хранить, и мы будем обращаться к каждому из них как локально, так и в роуминге. Сначала идут Настройки, затем Файлы.
Локальные и роуминговые настройки
Когда вы слышите слово «настройки» в разработке Windows 8 (или даже Windows Phone), «маленькие, простые данные» — это то, что приходит на ум. Мы действительно говорим о хранении пар имя / значение.
Хорошим примером этого являются пользовательские настройки. Возможно, вы сохранили имя пользователя (строковое значение), чтобы вы могли обращаться к ним как таковым в своей игре. Может быть, они решили отключить уведомления (логическое значение) из вашего приложения. Настройки также являются одним из самых простых способов хранения данных, и я неоднократно обнаруживал большое количество значений настроек в своих приложениях. Поскольку это невидимые значения, которые хранятся в невидимом хранилище данных, я объединил вместе набор методов, которые будут создавать, затем читать, а затем удалять значения параметров, как локально, так и в роуминге. Вы увидите, что на самом деле это довольно просто в использовании.
ApplicationDataContainer settingsLocal; ApplicationDataContainer settingsRoaming; string currentBook; int currentPage; public MainPage() { this.InitializeComponent(); settingsLocal = ApplicationData.Current.LocalSettings; settingsRoaming = ApplicationData.Current.RoamingSettings; AddSettings(); } private void AddSettings() { //There is no reason to set the same data to both local and roaming. //This is here merely for illustration of HOW to do it. //You should make the choice as to whether your data should be roamed. settingsLocal.Values["currentBook"] = "Hitchhiker's Guide To The Galaxy"; settingsLocal.Values["currentPage"] = 42; settingsRoaming.Values["currentBook"] = "Hitchhiker's Guide To The Galaxy"; settingsRoaming.Values["currentPage"] = 42; ReadSettings(); } private void ReadSettings() { //If you want typed data when you read it out of settings, //you're going to need to know what it is, and cast it. currentBook = (string)settingsLocal.Values["currentBook"]; currentPage = (int)settingsRoaming.Values["currentPage"]; DeleteSettings(); } private void DeleteSettings() { settingsLocal.Values.Remove("currentBook"); settingsLocal.Values.Remove("currentPage"); settingsRoaming.Values.Remove("currentBook"); settingsRoaming.Values.Remove("currentPage"); }
В примере проекта вы можете установить точки останова в начале каждого метода, а затем использовать Visual Studio для проверки значений наших настроек на вкладке Локальные.
Вот как выглядят мои данные после выполнения AddSettings () (нажмите, чтобы увеличить):
Теперь, после того как я прочитал данные из настроек и сохранил их в значениях на моей странице:
Наконец, после того, как мой метод DeleteSettings () был выполнен:
При создании приложений важно помнить, что все эти данные, как настройки, так и файлы, помещаются в изолированную программную среду вашего приложения. Это означает, что когда ваше приложение удалено, все значения исчезают вместе с ним. Это также означает, что когда вы создаете приложение, которое использует эти значения, и вы хотите начать с нового пользовательского интерфейса, вам может потребоваться удалить приложение с вашего компьютера перед его тестированием, чтобы избавиться от любых устаревших значений, которые могут иметь был сохранен ранее.
В дополнение к сохранению этих пар имя / значение, вы также можете немного классифицировать их. Мы можем создавать категории настроек, что значительно упрощает добавление и удаление групп настроек. Это также может быть сделано как локально, так и в роуминге. Вот взгляд на создание категории и добавление к ней настройки:
settingsLocal.CreateContainer("mediaSettings", ApplicationDataCreateDisposition.Always); settingsLocal.Containers["mediaSettings"].Values["Volume"] = 11;
Итак, мы внимательно изучили настройки, теперь перейдем к файлам.
Локальные и роуминговые файлы
Файлы работают очень похоже на настройки, за исключением того, что мы на самом деле читаем и записываем значения на жесткий диск, и я продемонстрирую это и в этом примере. Я установил набор методов, идентичный тому, который мы использовали в разделе «Настройки»: метод AddFile (), ReadFile и DeleteFile (). Вот посмотрите на код:
StorageFolder folderLocal; StorageFolder folderRoaming; string fileName = "tacotext.txt"; string fileContents = "taco"; public MainPage() { this.InitializeComponent(); folderLocal = ApplicationData.Current.LocalFolder; folderRoaming = ApplicationData.Current.RoamingFolder; AddFile(); } private async void AddFile() { StorageFile fileLocal = await folderLocal.CreateFileAsync(fileName, CreationCollisionOption.ReplaceExisting); await FileIO.WriteTextAsync(fileLocal, fileContents + "taco"); ReadFile(); } private async void ReadFile() { StorageFile fileLocal = await folderLocal.GetFileAsync(fileName); string textLocal = await FileIO.ReadTextAsync(fileLocal); fileContents = textLocal; DeleteFile(); } private async void DeleteFile() { StorageFile fileLocal = await folderLocal.GetFileAsync(fileName); await fileLocal.DeleteAsync(); }
Как видите, единственное существенное отличие заключается в том, что мы используем асинхронные / ожидающие методы, которые полагаются на чтение с жесткого диска. Нам не нужно указывать расположение папок, нам даже не нужно определять структуру папок, если мы этого не хотим.
Кроме того, вы можете посмотреть ваши файлы, как они сохранены. Каждое приложение хранит свои файлы локально на компьютере, и если вы используете точку останова, вы можете определить это местоположение на вашем устройстве. Например, созданный мной файл tacotext.txt хранится в свойстве Path, показанном ниже:
Создав его, вы можете открыть папку и просмотреть ее содержимое, даже открыв файлы самостоятельно:
Иначе, вот и все! Сохранение файлов, даже больших файлов, может быть сделано таким образом. Вам нужно только запомнить имя файла, который вы им дали. Песочница для Windows 8 позаботится обо всем остальном. Обратите внимание, что мой пример выше на самом деле хранит только локальный файл, но вы используете ТОЧНЫЙ код (вместо ссылки на ApplicationData.Current.RoamingFolder) для файлов роуминга.
Напоминаем, что перемещаемые файлы не будут передаваться немедленно, поэтому не ожидайте, какой тип производительности вы видели в приложениях Skydrive или DropBox. Помните о квоте данных, но в остальном используйте этот материал широко.
Настройки и файлы являются мощным инструментом в нашем арсенале разработки для Windows 8. Это легко сделать и делает ваше приложение намного круче, когда оно освещает сразу несколько машин. Я до сих пор рассказываю истории о том, как впервые играл в Jetpack Joyride на второй машине, и все мои покупки, реактивные ранцы, оборудование и настройки сразу же появились. Это сделало то, что уже является удивительной игрой, намного лучше для меня. Настолько, что я рекомендую вам самим взять это. (Это бесплатная игра, но есть возможность покупки в приложении за $ 1,49, чтобы удвоить ваши монеты с каждого пройденного уровня. В целом это того стоит.)
Чтобы загрузить весь пример кода из этой статьи, щелкните значок ниже:
Завтра мы собираемся обсудить Live Tiles и то, как мы создаем как первичные, так и вторичные плитки, а также как мы их обновляем. Увидимся позже!