Applications modernes

Accès aux données et options de stockage dans les applications du Windows Store

Rachel Appel

 

Rachel AppelLa gestion des données est un point crucial du développement des applications. Qu'il s'agisse d'une application de jeu, d'actualités, de voyage ou de mode, tout est une question de données. Les applications modernes doivent souvent gérer des données disséminées à plusieurs emplacements disparates et sous d'innombrables formats. Je vais présenter les différentes options de stockage des données et les API d'accès aux données dont vous disposez pour la création d'applications du Windows Store, dans tous les langages, ainsi que les stratégies de gestion des données, tant de contenu que de configuration.

Considérations relatives au stockage et à la gestion des données

En tant que développeur d'applications, vous devez déterminer les besoins en données de votre application avant le lancement de votre projet, car modifier l'architecture sous-jacente engendre de nombreux remaniements. Peut-être disposez-vous d'une source de données existante, auquel cas la décision s'impose d'elle-même, mais avec un projet vierge, il vous faut déterminer où stocker les données. Vos deux options sont le stockage sur le périphérique ou sur un emplacement distant :

  • Locale : généralement ces données sont dans un fichier ou dans une base de données locale, mais, dans Windows 8, vous pouvez désormais traiter d'autres applications comme des sources de données en utilisant des contrats ou le sélecteur de fichiers intégré. Dans les applications JavaScript, le stockage Web et l'API de base de données indexée (IndexedDB) sont également disponibles comme sources de données locales.  
  • Distante : ces données peuvent être dans le nuage, via Windows Azure SkyDrive ou un point de terminaison HTTP distant capable d'utiliser des données XML ou JSON, notamment les API publiques, telles que Facebook ou Flickr.

La taille des données détermine souvent si elles sont locales ou distantes ; toutefois, la plupart des applications modernes utilisent des données des deux sources. Cela tient au fait que les périphériques plus petits et plus mobiles, tels que les tablettes, tablettes tactiles et téléphones, sont devenus la norme et qu'ils ne disposent généralement pas d'un grand espace de stockage. En dépit de cela, ils ont tout de même besoin de données pour fonctionner correctement hors connexion. Ainsi, la tablette Surface, comme de nombreux périphériques portables, est proposée en deux modèles : 32 Go et 64 Go. Les données texte simples (JSON, par exemple) ne sont généralement pas volumineuses, mais les bases de données relationnelles et les données de média (images, audio et vidéo, par exemple) peuvent rapidement saturer un périphérique.

Examinons à présent les différentes options locales et distantes de stockage des données de contenu d'une application.

Stockage Web

Ce terme peut donner à croire que le stockage Web (bit.ly/lml0Ul) est un simple stockage sur le Web, mais il n'en est rien. En fait, le stockage Web, une norme HTML5, est un excellent moyen de conserver les données de l'application sur le client, et ce, localement. Les applications du Windows Store, tout comme les bonnes vieilles pages HTML, prennent en charge le stockage Web. Nul besoin de configurer une base de données, ni de copier des fichiers, puisque le stockage Web est une base de données en mémoire.

Le stockage Web est accessible via JavaScript par l'intermédiaire de l'une des deux propriétés suivantes de l'objet Window :

  1. localStorage : données locales qui persistent après la fermeture de l'application et sont disponibles pour les instances futures de l'application.
  2. sessionStorage : données locales également ; toutefois, les données sessionStorage sont détruites à l'arrêt de l'exécution d'une application du Windows Store.

Vous pouvez stocker des données, qu'il s'agisse de types simples ou d'objets complexes, dans le stockage Web en liant des propriétés dynamiques aux variables sessionStorage ou localStorage. Les propriétés dynamiques sont une paire clé/valeur avec une syntaxe semblable à ceci :

sessionStorage.lastPage = 5;
WinJS.xhr({ url: "data/data.json" }).then(function (xhr) {
  localStorage.data = xhr.responseText;
};

La propriété lastPage existe jusqu'à la fermeture de l'application, puisqu'elle fait partie de sessionStorage, tandis que la propriété data de localStorage persiste après la durée de vie de l'application.

Le stockage Web étant capable de conserver des données localement entre les sessions de l'application, il constitue un excellent choix pour la prise en charge des scénarios hors connexion. Les données peu volumineuses sont également davantage adaptées à une prise en charge hors connexion. Les données JSON étant compactes, il est facile de faire entrer la totalité des ensembles de données JSON dans l'espace de 5 Mo que fournit le stockage Web et de conserver suffisamment d'espace pour certaines données de média.

Le stockage Web étant une norme HTML5, il est uniquement disponible dans les projets du Windows Store créés avec JavaScript.

IndexedDB

IndexedDB est une autre référence de la famille HTML5 (bit.ly/TT3btM). Il s'agit d'une banque de données locale pour les jeux de données volumineux, permanents et pouvant faire l'objet d'une recherche. IndexedDB étant un composant de HTML5, vous pouvez l'utiliser dans les applications Web clientes pour les navigateurs, ainsi que dans les applications du Windows Store. IndexedDB stocke les éléments dans une base de données d'objets et est extrêmement souple, puisqu'elle vous permet de stocker tout type de données, des données texte jusqu'aux objets blob (Binary Large Objects). Les fichiers multimédias, par exemple, ont tendance à être plutôt volumineux. Le stockage des données audio et vidéo dans IndexedDB est donc un choix judicieux.

IndexedDB étant une base de données d'objets, elle n'utilise pas les instructions SQL ; vous devez donc accéder aux données via une syntaxe de styles orientés objet. L'interaction avec une banque de données IndexedDB s'effectue par l'intermédiaire de transactions et de curseurs, comme illustré ci-dessous :

var dataStore = "Datastore";
var trn = db.transaction(dataStore, IDBTransaction.READ_ONLY);
var store = trn.objectStore(dataStore);
trans.oncomplete = function(evt) { // transaction complete };
var request = store.openCursor();
request.onsuccess = function(evt) {
  var cursor = evt.openCursor();
};
request.onerror = function(error) { // error handling };

IndexedDB est spécialisée dans les données très volumineuses. Son utilisation pour le stockage de petits éléments entraîne donc un comportement inefficace, ce qui fait du stockage Web un bien meilleur choix pour les données locales granulaires. IndexedDB est également adaptée aux données de contenu, mais n'est pas appropriée pour les données de configuration des applications.

SQLite

SQLite (bit.ly/65FUBZ) est une base de données autonome, transactionnelle, relationnelle et basée sur des fichiers. Elle ne requiert aucune configuration et n'a pas besoin d'un administrateur de base de données pour sa maintenance. Vous pouvez utiliser SQLite avec n'importe quel langage Windows Runtime (WinRT), et elle est disponible sous forme d'extension Visual Studio. Bien que SQLite fonctionne bien dans les applications JavaScript, vous devez obtenir le wrapper WinRT SQLite3 (bit.ly/J4zzPN) à partir de GitHub avant de l'utiliser.

Les développeurs qui ont l'expérience d'ASP.NET ou de Windows Forms sont attirés par les bases de données relationnelles, mais un système de gestion de base de données relationnelle (SGBDR) n'est pas toujours la meilleure solution lorsque vous écrivez des applications modernes, et ce, en raison de problèmes d'espace sur les périphériques mobiles, ainsi que de la variété des types et des formats de données, en particulier multimédia. Comme SQLite est une base de données relationnelle, il est logique de l'utiliser pour les applications qui nécessitent des comportements transactionnels et relationnels. Cela signifie que SQLite est très utile pour les applications métier ou les applications de saisie de données, et peut également servir de référentiel pour les données locales hors connexion initialement obtenues à partir d'une source en ligne.

Si la base de données SQLite devient trop volumineuse pour les périphériques mobiles, vous pouvez la déplacer sur un serveur ou sur un emplacement dans le nuage. Le code changera peu, car la bibliothèque SQLite3 utilise une connexion classique et des objets Create/Read/Update/Delete (CRUD) semblables au code suivant :

// C# code that opens an async connection.
var path =
  Windows.Storage.ApplicationData.Current.LocalFolder.Path + @"\data.db";
var db = new SQLiteAsyncConnection(path);
// JavaScript code that opens an async connection.
var dbPath =
  Windows.Storage.ApplicationData.current.localFolder.path + '\\data.db;
SQLite3JS.openAsync(dbPath).then(function (db) {
  // Code to process data.
});

Comme vous pouvez le constater, l'utilisation de SQLite est tout à fait similaire celle d'autres bases de données. Les bases de données SQLite peuvent atteindre 140 To. Gardez à l'esprit que les données très volumineuses garantissent souvent les meilleurs niveaux de sécurité, de performances et d'intégrité des données pour l'administration des bases de données professionnelles. La plupart des administrateurs de base de données et des développeurs qui utilisent des bases de données relationnelles préfèrent se servir d'un outil GUI pour la création et la gestion des objets de base de données ou pour l'exécution de requêtes ad hoc sur les données, et l'utilitaire d'administration Sqliteman (bit.ly/9LrB1o) est parfait pour toutes les opérations de base dans SQLite.

Si vous transférez des applications de bureau Windows écrites dans Windows Forms, Windows Presentation Foundation (WPF) ou Silverlight, vous utilisez peut-être déjà SQL Server Compact (SQL CE). Dans ce cas, vous pouvez effectuer la migration des bases de données SQL CE vers SQLite avec l'utilitaire ExportSqlCE (bit.ly/dwVaR3), puis utiliser Sqliteman pour les administrer.

Fichiers en tant que données et API de fichier

Pourquoi s'embarrasser d'une base de données, en particulier si les utilisateurs de votre application souhaitent conserver les fichiers qu'ils ont déjà ? Ceci s'applique en particulier aux photos et aux documents. L'API de fichier ne se contente pas de fournir un navigateur pour les répertoires et fichiers. Elle permet aussi à l'utilisateur de choisir une application comme emplacement de fichier. Cela signifie que les applications peuvent communiquer entre elles et échanger des données. Un sélecteur d'ouverture de fichier peut interagir avec Bing, un appareil photo ou des applications photo, ainsi qu'avec des répertoires standard et des emplacements nommés tels que Mes documents, Vidéos ou Musique. Le partage facile de données entre applications, services et fichiers personnels est une fonctionnalité de Windows de première importance.

De nombreux systèmes d'exploitation ont un mécanisme d'enregistrement des types de fichiers que les applications prévoient d'utiliser, ainsi que la possibilité de lancer ces applications lorsqu'un utilisateur interagit avec une icône dans le système d'exploitation. Dans Windows, ceci s'appelle une association de fichiers. Windows 8 approfondit davantage ce concept en permettant aux applications de communiquer entre elles à l'échelle du système, via une fonctionnalité appelée « contrats ». L'une des façons d'implémenter un contrat consiste à passer par un sélecteur de fichiers. Notez que le code suivant est identique aux API FileDialog des applications de bureau ou des versions précédentes de Windows (remarque : dans cet exemple, une partie du code a été omise par souci de concision. Pour une étude plus complète de la classe FileOpenPicker, reportez-vous à bit.ly/UztmDv):

fileOpen: function () {
  var openPicker = new Windows.Storage.Pickers.FileOpenPicker();
  openPicker.viewMode = Windows.Storage.Pickers.PickerViewMode.thumbnail;
  openPicker.suggestedStartLocation =
    Windows.Storage.Pickers.PickerLocationId.picturesLibrary;
  openPicker.fileTypeFilter.replaceAll([".png", ".jpg", ".jpeg"]);
  openPicker.pickSingleFileAsync().done(function (file) {
  // ...
  });
}

Choisir une application dans un sélecteur Windows 8 permet de la lancer. Par exemple, si l'utilisateur sélectionne Bing, le sélecteur lancera l'application Bing, puis renverra la sélection d'images de l'utilisateur à votre application.

Maintenant que nous avons vu les options locales, examinons les options pour les données distantes.

Services Web et API Web ASP.NET

La plupart des développeurs sont habitués à utiliser et à modifier des données avec les services Web XML, car ceux-ci remontent à Microsoft .NET Framework 1.x. Le principal avantage des services Web est que les données se trouvent à un emplacement distant central et que les applications de plusieurs périphériques peuvent accéder aux données à tout moment lorsqu'ils sont connectés. L'accès à la base de données sous-jacente s'effectue via un ensemble de points de terminaison HTTP qui échange des données JSON ou XML. De nombreuses API publiques, comme Twitter ou Flickr, exposent des données JSON ou XML que vous pouvez utiliser dans des applications du Windows Store.

Les services Web sont de types très variés :

  • Services ASMX : ils utilisent ASP.NET classique pour distribuer des données via HTTP.
  • Services WCF (Windows Communication Foundation) et RIA (Rich Internet Application) : cette méthode d'envoi des données entre des points de terminaison HTTP est basée sur les messages.
  • OData : protocole Open Data Protocol, autre API pour le transport des données via HTTP.
  • API Web ASP.NET : nouvelle infrastructure ASP.NET MVC 4 simplifiant la création de services HTTP RESTful qui fournissent des données JSON ou XML aux applications ou aux sites Web.

Si vous créez des services principaux à partir de zéro, l'API Web ASP.NET rationalise le processus de développement en facilitant la création de services selon une approche RESTful cohérente, afin qu'ils puissent être facilement utilisés par les applications. 

Quel que soit le service principal, s'il est sur HTTP, vous pouvez utiliser les objets HttpWebRequest et HttpWebResponse pour communiquer avec un service Web via C#. Les applications JavaScript sont dotées d'un wrapper WinJS XMLHttpRequest pour les opérations asynchrones. Il ressemble au code suivant :

WinJS.xhr({ url: "data.json" }).then(function (xhr) {
  var items = JSON.parse(xhr.responseText);
  items.forEach(function (item) {
    list.push(item);
  })
});

L'espace de stockage n'est généralement pas un problème avec les services Web. En effet, un service Web est simplement un logiciel qui transporte les données entre des points de terminaison. Cela signifie que sa base de données sous-jacente peut se trouver n'importe où, sur un serveur distant, sur un hôte Web ou sur une instance Windows Azure, par exemple.

Vous pouvez héberger n'importe lequel des services Web présentés ci-dessus (comme une instance d'API Web ASP.NET ou un service WCF sur Windows Azure) avec les données proprement dites.

SkyDrive

N'oubliez pas que SkyDrive (bit.ly/HYB7iw) n'est pas seulement une option de stockage de données, c'est également une excellente option. Pensez à SkyDrive comme à une option de stockage sans stockage. Les utilisateurs peuvent choisir SkyDrive comme emplacement dans le nuage et accéder aux documents via les sélecteurs d'ouverture ou d'enregistrement de fichier. Permettre aux utilisateurs d'enregistrer des fichiers sur SkyDrive signifie la fin des problèmes de gestion de base de données. En outre, avec 7 Go disponibles par utilisateur, l'espace ne risque pas de manquer. Les utilisateurs de SkyDrive peuvent également acheter de l'espace de stockage supplémentaire.

L'API Live (bit.ly/mPNb03) contient un jeu complet d'API RESTful SkyDrive pour lire et écrire sur SkyDrive. Un appel à SkyDrive pour récupérer une liste d'éléments partagés se présente comme suit :

GET https://apis.live.netv5.0/me/skydrive/shared?access_token=ACCESS_TOKEN

Un espace de noms Microsoft.Live permet aux développeurs C# d'accéder aux API Live et SkyDrive, tandis que les développeurs JavaScript peuvent réaliser des appels RESTful avec les verbes HTTP POST ou PUT. SkyDrive n'est pas recommandé pour les données de configuration des applications.

Mobile Services Windows Azure

Mobile Services Windows Azure est une excellente option pour ceux qui créent des applications inter- ou multiplateformes. Gérée par Windows Azure, cette option propose plus qu'un simple stockage évolutif ; elle offre des notifications push, une gestion de la logique métier, une API d'authentification et un kit SDK complet. Outre ces fonctionnalités, un outil convivial d'administration Web est fourni. 

Le kit SDK Mobile Services est intégré aux applications du Windows Store, Windows Phone 8, iOS et Android. Toutes les principales plateformes sont prises en charge, et avec le kit SDK Mobile Services vous pourrez créer un prototype fonctionnel en quelques minutes et aurez toutes les cartes en main pour fournir des données à des applications multiplateformes en un rien de temps.

Parmi les nombreux éléments qui composent le SDK, vous pouvez utiliser l'objet de requête pour interroger les données des tables, comme ci-dessous :

var query = table.orderBy('column').read({ success: function(results) { ... }});

Comme vous pouvez le voir, le code est pratiquement identique aux autres API. Sa courbe d'apprentissage est donc semblable à celles des autres options présentées ici. Vous pouvez accéder au kit SDK et à Mobile Services à l'aide de n'importe quel langage d'application du Windows Store.

Options de stockage et de gestion des données de l'application

Toutes les options d'accès et de stockage des données que nous avons vues précédemment concernent le stockage de contenu, mais, en tant que développeur, vous devez également vous occuper des données de configuration de l'application. Il s'agit des métadonnées qui décrivent votre application ou les fonctionnalités du périphérique, et non des données de l'utilisateur. Les applications modernes utilisent à la fois des données d'applications permanentes (telles que les préférences utilisateur) et des métadonnées temporaires (telles que la dernière position de défilement de l'utilisateur ou ses tendances en matière de termes de recherche). Ces commodités, minimes, mais efficaces, garantissent la meilleure expérience possible à l'utilisateur. Il est donc important de les intégrer à votre application.

Bien que certaines de ces données portent sur le périphérique, dites-vous que beaucoup d'applications fonctionnent sur plusieurs plateformes et périphériques, et qu'il est donc souvent judicieux de centraliser et de synchroniser les données d'application dans Windows Azure avec les données de contenu.

Un ensemble spécifique d'API de gestion des données d'application existe dans une classe nommée avec justesse ApplicationData dans l'espace de noms Windows.Storage, et le code ressemble à ceci :

var localSettings = Windows.Storage.ApplicationData.current.localSettings;
var roamingSettings = Windows.Storage.ApplicationData.current.roamingSettings;

Vous pouvez stocker des objets simples ou complexes, dans les propriétés localSettings ou roamingSettings.

Utiliser des paramètres locaux ou d'itinérance est la meilleure manière de travailler avec des données de configuration. Les technologies telles que IndexedDB, les fichiers ou SkyDrive ne sont ordinairement pas appropriées pour les données de configuration des applications, et SQLite ne se justifie ici que si l'application l'utilise déjà pour le stockage de contenu. Vous devez également choisir ce qu'il faut faire quand l'application est hors ligne ou déconnectée d'Internet. Autrement dit, certaines de vos données doivent être mises en cache, mais sans consommer trop d'espace disque.

Contenu et configuration

En résumé, pour implémenter une architecture de données appropriée, vous devez éviter de dépendre de l'espace disponible limité des appareils mobiles, c'est ce qui rend l'hébergement des données dans le nuage intéressant. Mais, si vous avez une base de données héritée, il peut être indispensable de la réutiliser. Les applications du Windows Store prennent en charge de nombreux besoins de stockage BLOB et structurés pour le contenu et la configuration.

Si vous créez une application du Windows Store et avez besoin d'aide pour choisir une stratégie d'accès aux données, je vous recommande fortement de consulter le programme Generation App (bit.ly/W8GenAppDev). Generation App vous guide lors du processus de création d'une application du Windows Store (ou Windows Phone) en 30 jours, en offrant des consultations et une assistance techniques et conceptuelles gratuites avec des conseils et ressources réservés.

Rachel Appel est développeuse chez Microsoft, New York. Vous pouvez la joindre via son site Web rachelappel.com ou par e-mail à l'adresse rachel.appel@microsoft.com. Vous pouvez également suivre ses derniers commentaires sur Twitter à l'adresse twitter.com/rachelappel.

Merci aux experts techniques suivants d'avoir relu cet article : Scott Klein et Miriam Wallace