Опубликован: 26.12.2012 | Уровень: для всех | Доступ: платный
Лекция 6:

Работа с файлами

< Лекция 5 || Лекция 6: 12 || Лекция 7 >

Сохранение данных приложения

Время от времени приложению может быть необходимо сохранить данные или настройки на диске. К примеру, требуется сохранить пользовательские настройки или список файлов. Для этих целей нужно использовать Local Application Data (локальные данные приложения).

Пользователю также могут понадобиться эти настройки для синхронизации между всеми устройствами. Можно использовать Roaming Application Data (перемещаемые данные приложения) для разрешения синхронизации между пользовательскими устройствами.

Некоторым приложениям могут потребоваться Temporary Application Data (временные данные) – к примеру, файлы, которые кэшируются в течение одного сеанса работы с приложением, или промежуточные файлы. Нельзя гарантировать, что после завершения работы приложения такие файлы останутся, пользователь может выполнить очистку диска для их удаления.

Хранение данных Описание
Local Application Data (Локальные данные приложения) Расположены на текущем носителе до тех пор, пока приложение или пользователь не удалит их
Roaming Application Data (Перемещаемые данные приложения) Расположены на всех устройствах, на которые установлено приложение (механизм их работы основан на синхронизации)
Temporary Application Data (Временные данные приложения) Расположены на текущем носителе, но могут быть удалены системой в любой момент

Описанные выше и сохранённые в папках на диске файлы хранения данных находятся в папке C:\Users\{Username}\AppData\Local\Packages\{package family ID}\

… где {Username} – это идентификатор пользователя в Windows, {package family ID} – это идентификатор пакета приложения, который можно найти на вкладке Упаковка (Packaging) в редакторе манифеста приложения.

Упражнение: сохранение данных приложения

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

  1. Откройте файл /js/data.js
  2. Добавьте новую группу под названием MyImages (Мои изображения), вставив выделенный код сразу после группы Baseball (Бейсбол).

    Этот код доступен в файле \Module_6_Assets\snippets\addInMyImagesGroup.txt

    var sampleGroups = [
        { key: "Basketball", title: "Basketball", subtitle: "Search results …
        { key: "Soccer", title: "Soccer", subtitle: "Search results for Soccer …
        { key: "Baseball", title: "Baseball", subtitle: "Search results for …
    
        // Add in "My Images"
        {     
            key: "MyImages", title: "My Images",
            subtitle: "My Image Collection",
            backgroundImage: "/images/groupMyImages.png",
            description: "This group contains images added by the user."
        },
    ];
    
  3. Затем добавьте в data.js функцию, которая читает файл изображения с диска, создаёт новый элемент данных из группы MyImages и преобразует эту группу в массив для того, чтобы она могла быть сериализована и записана на диск. ( Можно добавить эту функцию сразу после функции getItemsFromGroup).

    Этот код находится в файле \Module_6_Assets\snippets\addInMyImagesGroup.txt

    function addToMyImages(title, description, imageFile) {
    
        var imageFileBase64;
    
        imageFile.openAsync(Windows.Storage.FileAccessMode.read).then(function (_stream) {
            var inputStream = _stream;
            var reader = new Windows.Storage.Streams.DataReader(inputStream);
            var size = inputStream.size;
            if (size > 0) {
                reader.loadAsync(size).then(function () {
                    var b = reader.readBuffer(size);
                    imageFileBase64 = 
                       Windows.Security.Cryptography.CryptographicBuffer.encodeToBase64String(b);
    
                    imageFileBase64 = "data:image/png;base64," + imageFileBase64;
    
                    // Add a new item to "My Images"
                    var item = { group: sampleGroups[3], title: title, subtitle: imageFile.name, 
    description: description, content: itemContent, backgroundImage: imageFileBase64 };
                    list.push(item);
    
                    // filter out just the "My Images" group items, and convert to an ARRAY 
    // with slice(0)... this is so it can be serialized properly!
                    var myImagesGroup = getItemsFromGroup(sampleGroups[3]).slice(0);
    
                    // serialize to JSON for storage as string
                    var myImagesSerialized = JSON.stringify(myImagesGroup);
    
                    // SAVE to local storage 
                    var applicationData = Windows.Storage.ApplicationData.current;
                    var localFolder = applicationData.localFolder;
    
                    localFolder.createFileAsync("myimages.txt",
        Windows.Storage.CreationCollisionOption.replaceExisting)
                        .then(function (sampleFile) {
                            return Windows.Storage.FileIO.writeTextAsync(sampleFile, 
    myImagesSerialized);
                        });
    
                });
            }
    
        });
    }
    

    О сериализации

    В коде, приведённом выше, вы сохранили массив объектов на диск с применением сериализации. Сериализация – это процесс преобразования объектов в формат хранения, подходящей для записи на диск или сетевой передачи. Здесь используется специальный объект JSON, который позволяет выполнять сериализацию в формате JavaScript Object Notation (объектная нотация JavaScript).

    Вы узнаете о JSON в 7 модуле.

  4. Вам необходимо, чтобы функция addToMyImages была доступна для вызова за пределами data.js, поэтому необходимо сделать её внешней (public), соответствующим образом описав ее при объявлении пространства имен. Добавьте выделенный код внизу data.js, в разделе объявления пространства имен.
    WinJS.Namespace.define("Data", {
        items: groupedItems,
        groups: groupedItems.groups,
        getItemsFromGroup: getItemsFromGroup,
        getItemReference: getItemReference,
        resolveGroupReference: resolveGroupReference,
        resolveItemReference: resolveItemReference,
        addToMyImages: addToMyImages
    });
    
  5. Откройте /js/addImageFlyout.js
  6. Найдите вызов btnAddItem.addEventListener в функции инициализации. Удалите код диалогового сообщения (Message Dialog) и замените его выделенными строками ниже. Этот код выполняется, когда нажимается кнопка Добавить элемент, и он скрывает всплывающее меню и панель приложения и сохраняет данные изображения.
    btnAddItem.addEventListener("click", function (e) {
        // the following code will be executed when btnAddItem is clicked:
        var title = document.getElementById("title");
        var description = document.getElementById("description");
                
        btnAppBarAddImage.winControl.flyout.hide();
        appbar.winControl._sticky = false;
        // save the new item to the data
        Data.addToMyImages(title.value, description.value, 
    ImageUtils.picturePicked);
    });
    

Итоги

В некоторых случаях для доступа к пользовательским файлам в приложениях необходимо объявлять возможности. Иногда File Picker (средство выбора файла) пригодно для того, чтобы разрешить пользователю задействовать файлы в приложении. Но независимо от того, какой доступ необходим в данный момент, важно понимать асинхронную модель. Необходимо знать, когда должны использоваться методы 'then' и 'done'.

Самостоятельная работа

В упражнениях этого модуля вы сохраняли пользовательские изображения на локальный носитель. Каким образом можно сделать эти данные перемещаемыми (roaming), чтобы этим можно было пользоваться на всех пользовательских устройствах? Выясните это по нижеприведенной ссылке, после чего добавьте возможности по работе с перемещаемыми данными (roaming data) в ваше приложение.

http://msdn.microsoft.com/en-us/library/windows/apps/hh465123.aspx

Вопросы

  1. Имеют ли WinRT-приложения полный доступ к пользовательским файлам по умолчанию?
  2. Когда необходимо объявлять возможности в манифесте приложения?
  3. Как можно сохранить пользовательские настройки в приложении?

Дополнительные ресурсы

Вы можете узнать больше о работе с файлами и о разрешениях, зайдя по следующим ссылкам.

Ответы

  1. Нет. Для программируемого доступа к целой библиотеке, например, библиотеке музыки, необходимо объявлять возможности в манифесте приложения.
  2. Если необходим программируемый доступ к целой библиотеке.
  3. Пространство имён Windows.Storage.ApplicationData разрешает сохранение специальных пользовательских данных, используя локальное хранилище данных.
< Лекция 5 || Лекция 6: 12 || Лекция 7 >
Роман Храпай
Роман Храпай
Россия
ashutos Jain
ashutos Jain
Индия, New Delhi