Зберігання даних і життєвий цикл додатки

У додатку повинна бути можливість зберігати дані – настройки, відомості про стан і дані для майбутньої синхронізації До того ж слід забезпечити комфортну роботу користувача на різних пристроях Дані, призначені для зберігання, можуть бути представлені і як набір змінних простих типів, і у вигляді файлів різної структури У звязку з цим в Windows Runtime виділяють три способи зберігання даних програми

·&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp Локальні дані – всі налаштування зберігаються в реєстрі або всередині файлів, асоційованих з конкретним користувачем

·&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp Роумінг даних – дані розміщуються в хмарі і можуть використовуватися додатком на різних пристроях

·&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp Тимчасові дані – дані розміщуються у тимчасовому сховищі і можуть бути видалені в будь момент

Розглянемо детально кожен з механізмів зберігання даних

Якщо говорити про локальний сховище, то тут існує дві можливості: зберігати прості дані всередині реєстру і зберігати дані всередині файлів Зрозуміло, що оскільки додатки Metro працюють всередині власної

«Пісочниці», то прямого доступу до реєстру або файлової системи у них немає З цієї причини Windows Runtime пропонує спеціальний набір класів, який дозволяє зберігати дані у виділеному розділі реєстру або папці, асоційованої з конкретним користувачем Представлені класи виконують всю чорнову роботу За великим рахунком, розробник може і не здогадуватися, де зберігаються дані

Отже, якщо ми говоримо про зберігання простих типів в реєстрі, то тут доступні такі класи

·&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp ApplicationDataContainer – Являє собою контейнер, куди можна зберігати дані простих типів або дані, побудовані на базі ApplicationDataCompositeValue З кожним додатком асоціюється контейнер за умовчанням, але можна і примусово створювати вкладені контейнери (аналог ключів і папок в реєстрі)

·&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp ApplicationDataCompositeValue – Цей клас дозволяє зібрати складний тип даних на підставі кількох простих Фактично, зазначений механізм полегшує угруповання даних простих типів Подібне можна зробити і за допомогою вкладених контейнерів, але розглянута клас більш простий у використанні

Перераховані вище класи знаходяться в просторі імен WindowsStorage і можуть бути використані без особливих труднощів Наприклад, якщо Ви хочете отримати контейнер за умовчанням або створити новий іменований контейнер, то можна застосувати наступний код

ApplicationDataContainer current = ApplicationDataCurrentLocalSettings

ApplicationDataContainer named = currentCreateContainer(

&quotmyContainer&quot, ApplicationDataCreateDispositionAlways)

Цей код отримує посилання на основний контейнер, асоційований з користувачем додатки, а потім створює вкладений контейнер

Маючи посилання на контейнер, можна приступити до збереження простих даних Якщо мова йде про реєстр, то підтримуються наступні типи даних: Boolean, Double, Int32, Int64, Single, String, UInt8, UInt32, UInt64

Код нижче демонструє, як можна додати нову пару ключ-значення в контейнер

currentValues[&quotmyValue&quot] = 5 currentContainers[&quotmyContainer&quot]Values[&quotmySecondValue&quot] = &quotHello"

Як бачите, в прикладі присутні прості індексатори, які дозволяють легко створити пару або отримати значення за відомим ключу

Нарешті, якщо Ви хочете створити в контейнері комплексне (композитне)

значення, то можна скористатися наступним кодом

ApplicationDataCompositeValue composite = new ApplicationDataCompositeValue()

composite[&quotfirstVal&quot] = 1 composite[&quotsecondVal&quot] = &quotHello"

currentValues[&quotcompValue&quot] = composite

Набагато цікавіше працювати з файлами Для їх зберігання додатком також виділяється окремий контейнер, з яким можна взаємодіяти за допомогою класу StorageFolder

StorageFolder current = ApplicationDataCurrentLocalFolder

Створений вище обєкт має безліч цікавих методів

·&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp CreateFileAsync – Створює файл

·&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp CreateFolderAsync – Створює каталог

·&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp DeleteAsync – Видаляє обєкт (файл або каталог)

·&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp RenameAsync – Дозволяє виконати перейменування обєкта

·&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp GetFileAsync – Дозволяє повернути посилання на файл з вказаним імям

(Обєкт типу StorageFile)

·&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp GetFilesAsync – Повертає список файлів, які відповідають запиту

·&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp GetFolderAsync – Повертає зазначений у параметрах каталог

·&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp GetFoldersAsync  – Повертає список каталогів, відповідають запиту

·&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp OpenStreamForReadAsync – Відкриває файл для читання, дозволяє повернути обєкт типу Stream, представлений в платформі NET Framework вже давно Цей і наступний метод можна використовувати для стандартного для NET взаємодії з файлами

·&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp OpenStreamForWriteAsync – Аналогічний попередньому методу, але відкриває файл для запису

·&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp OpenAsync – Дозволяє відкрити файл і обійтися тільки механізмами Windows Runtime, надаючи механізми роботи з файлом через інтерфейси

Розглянемо невеликий приклад, що демонструє створення файлу в кореневому каталозі програми

public async void WriteFile()

{

StorageFolder current = ApplicationDataCurrentLocalFolder

StorageFile file = await currentCreateFileAsync( &quothellotxt&quot, CreationCollisionOptionReplaceExisting)

IRandomAccessStream writeStream =

await fileOpenAsync(FileAccessModeReadWrite) IOutputStream outputStream = writeStreamGetOutputStreamAt(0)

DataWriter dataWriter = new DataWriter(outputStream) dataWriterWriteString(&quothello&quot)

await dataWriterStoreAsync() outputStreamFlushAsync()

}

Як бачите, код не дуже просте і вимагає регулярного звернення до операторів await, Та й сам метод був оголошений з модифікатором async Зате ми скористалися тільки можливостями WinRT, не вдаючись до механізмів

. N ET, а щоб не активувати механізми роботи з масивом байтів, застосували допоміжний клас DataWriter Цей клас може використовувати потік, щоб полегшити процедури читання і запису у файл

Процедура читання даних з файлу виглядає аналогічно

public async void ReadFile()

{

StorageFolder current = ApplicationDataCurrentLocalFolder

StorageFile sampleFile = await currentGetFileAsync(&quothellotxt&quot) IRandomAccessStream readStream =

await sampleFileOpenAsync(FileAccessModeRead)

IInputStream inputStream = readStreamGetInputStreamAt(0) DataReader dataReader = new DataReader(inputStream)

string myString = dataReaderReadString((uint)readStreamSize)

}

Якщо Ви хочете створювати дані, які будуть доступні користувачеві на різних пристроях, то можете скористатися хмарою і спеціальними класами, які дозволяють зберігати налаштування користувача абсолютно безкоштовно

Потрібно відзначити, що якщо користувач знищить додаток, то дані залишаться доступними ще 30 днів, поки не будуть знищені повністю Якщо за цей час користувач встановить додаток заново, то всі його налаштування будуть збережені З іншого боку, тут є явна перевірка на версійність додатки Так, якщо користувач встановив оновлення програми на один з пристроїв, то оновлені дані стануть доступні на інших пристроях тільки тоді, коли користувач поставить оновлення і там

Перейдемо до класів, які використовуються для створення «переносите» даних Тут діють вже відомі механізми Ось код, який дозволяє отримати посилання на можливість створення обєктів і файлів в хмарі:

ApplicationDataContainer current=ApplicationDataCurrentRoamingSettings StorageFolder file=ApplicationDataCurrentRoamingFolder

Як бачите, тут задіяні ті ж механізми, що і при роботі з локальним сховищем Втім, обєкт ApplicationData володіє двома додатковими властивостями, які можуть бути корисні при роботі з цим типом даних:

·&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp RoamingStorageQuota – Показує обсяг простору, доступного додатком

·&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp RoamingStorageUsage – Показує обсяг використовуваного простору

Ці обмеження дозволяють Вам зберігати дійсно необхідні дані в хмарі і при цьому уникати організації повноцінного файлового сховища, за який необхідно платити

Так як використовуються ті ж обєкти, що і при роботі з локальним сховищем, механізми створення даних нічим не відрізняються Але оскільки дані може змінити і додаток, встановлений на інший пристрій, то необхідно визначити обробник події, що дозволяє реагувати на подібну ситуацію

void InitHandlers()

{

ApplicationDataCurrentDataChanged +=

new TypedEventHandler&ltApplicationData, object&gt(DataChangeHandler)

}

void DataChangeHandler(ApplicationData appData, object o)

{

/ / Оновлення даних

}

Нарешті, розробнику доступно і тимчасове сховище даних Цей своєрідний кеш може бути очищений в будь-який момент При цьому він зменшує трафік і прискорює роботу програми Логічно, що в подібний кеш має сенс писати тільки файли Ніжеуказанной рядок дозволяє отримати посилання на каталог, де буде зберігатися кеш для програми

StorageFolder folder=ApplicationDataCurrentTemporaryFolder

Далі робота відбувається вже за шаблоном

Сергій Лутай, Сергій Байдачний, Windows 8 для C # розробників

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*