Data Store API

Non-standard
Cette fonctionnalité ne fait pas partie des normes actuelles du W3C, mais elle est prise en charge sur la plate-forme Firefox OS. Bien que les implémentations puissent changer à l'avenir et qu'il ne soit pas largement pris en charge par les navigateurs, il convient pour une utilisation dans le code dédié aux applications Firefox OS.

Cette API est disponible sur Firefox OS pour les applications internes uniquement.

L'API Data Store fournit un mécanisme de stockage puissant et flexible que les applications Firefox OS peuvent utiliser pour stocker et partager des données. Il s’agit en fait d’un magasin intermédiaire permettant à plusieurs applications de partager des données entre elles rapidement, efficacement et en toute sécurité, malgré les différences entre les structures de données des API, les formats, etc.

Concepts et usages

L'API Data Store a été créée pour permettre à plusieurs applications Firefox OS, avec des structures de données et des mécanismes de stockage potentiellement différents, de créer, de maintenir et de partager efficacement les mêmes objets de données entre elles. Chaque application peut ensuite importer les données dans sa propre base IndexedDB locale pour indexer en fonction de leurs besoins en matière de requête. Cela n'est toutefois pas nécessaire et vous pouvez simplement écrire directement dans le magasin de données de l'API du magasin de données.

Note: Pour plus d'informations concernant le fonctionnement de l'API Data Store avec des exemples, consultez notre article Utiliser l'API Data Store.

Note: L'API Data Store est disponible dans Web Workers, à partir de Firefox 32 (Firefox OS 2.0; voir bug 949325.)

Il y a plusieurs raisons d'utiliser cette API, comme :

  • Permettre à une application de créer des données qu’elle peut ensuite partager avec d’autres applications.
  • Permettre à plusieurs applications de fournir des données au même data store.
  • Permettre la lecture seule des data stores tels que les contacts Facebook (en d’autres termes, il permet à une application de créer et de gérer les données, tandis que d’autres applications peuvent seulement lire les données du store).
  • Permettre la lecture/écriture du data store, de sorte que plusieurs applications puissent contribuer sur le même data store. Un exemple serait les contacts standard de l'appareil, qui peuvent être mis à jour à la fois par l'application Contacts intégrée et par les applications tierces.
  • Permettre la conservation du cache de stockage local de données d'un data store, avec des notifications permettant à l'application de savoir quand des modifications ont été apportées au data store principal afin que le cache puisse être mis à jour.

Chaque data store appartient à une application spécifique (comme spécifié par le champ datastores-owned dans le manifeste de l'application - voir Manifest_fields, ci-dessous). Cette propriété donne à l'application le droit de remplir le data store et de déclarer si le magasin de données est readonly (ce qui signifie que les autres applications ne peuvent lire que les données) ou readwrite (ce qui signifie que d'autres applications peuvent modifier les données ainsi que les lire.) Les autres applications peuvent accéder à un data store en le nommant dans le champ datastores-access de son manifeste. 

Lorsqu'une application souhaite accéder à un data store, elle doit appeler Navigator.getDataStores(). La valeur résultante de cette méthode est un objet Promise qui sera résolu avec un tableau d'objets DataStore. À partir de ces objets DataStore, l'application peut lire et modifier des valeurs à l'aide de différentes méthodes du DataStore telles que DataStore.get() et DataStore.insert().

Note: L'API Data Store n'impose pas pour le moment de limitations sur l'espace de stockage. Cela sera surement changé dans un futur proche.

Gestion du changement et résolution des conflits

Quand plusieurs applications effectuent des changements dans un data store, cela peut créer des conflits. Cependant, toutes les modifications effectuées ( en utilisant DataStore.update(), DataStore.add(), reçoivent un revisionId, un UUID reçu dans l'évenement change est déclenché chaque fois qu'une opération est effectuée sur le data store par une application ayant accès à celui-ci. Cela peut être lu à partir de la propriété DataStore.revisionId

La propriété revisionId peut être incluse en tant que paramètre facultatif dans les méthodes DataStore.add(), DataStore.put(), DataStore.remove(), DataStore.clear(), and DataStore.sync(). Elles utilisent essentiellement revisionId pour éviter les conflit - l'opération est annulée si cette revisionId n'est pas la dernière connue par le data store (c'est-à-dire si une autre application a apporté une modification plus récente).

Lorsque l'événement change est déclenché, il reçoit un objet DataStoreChangeEvent, donnant à l'application l'accès à:

Quand une application veut savoir ce qui a changé, elle peut le faire en demandant le "delta" entre le dernier revisionId et l'actuel. Cela s'effectue avec la méthode DataStore.sync() . Vous pouvez autoriser votre application à gérer les changements des données en utilisant sync() lors du démarage de l'application et onchange en lui passant lerevisionId actuel pour vérifier de nouveau.

Filtrage des donnée

Comme indiqué ci-dessus, l'API Data Store n'est pas responsable du filtrage des données ni de la création d'index. Au lieu de cela, elle laisse cela au mécanisme de stockage local de l'application (généralement  IndexedDB); L'API Data Store permet simplement de mettre à jour les index locaux, via l'objet DataStoreCursor, créé lors de l'appel de sync().

Champs du manifest

Le manifest propriétaire du data store DOIT inclure le champ datastores pourrevendiquer la propriété, par exemple :

"datastores-owned": {
  "myData": {
    "access": "readwrite",
    "description": "mon data store"
  }
}

Vous pouvez inclure différentes propriétés pour représenter différents data stores, et chacun peut utiliser readonly/readwrite pour spécifier si le data store peut être lu / modifié par d'autres applications. Une description est également incluse pour décrire le data store.

Les autres application qui veulent accèder au data store mais qui ne leur appartient pas doivent inclure le champdatastores-access , par exemple :

"datastores-access": {
  "myData": {
    "access": "readonly",
    "description": "Lire et modifier mon data store"
  }
}

Sans ce champ, la réponse par défaut est "no access". Encore, plusieurs propriétées peuvent être incluses si vous voulez accèder à plusieurs data stores, et un accès readonly ou readwrite peut être mis pour déclarer le type d'accès dont l'application a besoin.

En termes de permissions, le propriétaire du data store gagne toujours contre les applications tières. Si le propriétaire déclare "readonly": true dans le manifest, toutes les applications tières seront readonly, même si elles déclarent "access": "readwrite" dans leur manifest. Bien sûr, cela n’est pas très utile si le propriétaire autorise la modification du magasin de données par des applications tierces. Pour le moment, Data Store est une API certifiée. Il est probable que les privilèges reviendront à la finalisation du modèle de sécurité.

Note: Rappelez-vous également que dans de tels cas, vous devez utiliser le champ type de votre manifeste pour déclarer explicitement que votre application est une application interne / certifiée : "type": "certified".

Interfaces de l'API Data Store

L'API Data Store contient les interfaces suivantes :

DataStore
L'interface DataStore représente  un ensemble de données récupérées, et inclut des propriétés standards pour accèder au nom du store, le propriétaire, etc. mais aussi des méthodes pour lire, modifier et syncroniser les données, et le gestionnaire d'évenements  onchange pour réagire aux changements dans les données.
DataStoreCursor
Cette interface permet à l'application de parcourir une liste d'objets  DataStoreTask représentant l'historique des changements du data store, pour utiliser lors de la syncronisation des données.
DataStoreChangeEvent
Cette interface représente l'évenement lié à un enregistrement changé dans le data store, par exemple elle est renvoyée une fois qu'une modification est effectuée et que l'événement change est déclenché (voir DataStore.onchange pour le gestionnaire), à utiliser lors de la synchronisation de modifications individuelles.
DataStoreTask
Cette interface représente un enregistrement changé dans le data store quand  est utilisé pour parcourir l'historique des modifications du data store.

Exemples

Nous avons écrit quelques exemples qui vont ensemble, pour expliquer comment différentes applications peuvent avoir différents usages du même data store :

  • L'éditeur de contacts Data Store crée un data store nommé "contacts" sur la machine sur laquelle il est installé, ajoute quelques données et autorise l'utilisateur à ajouter et supprimer des contacts.
  • Le visionneur de contacts Data Store a un accès en lecture uniquement au data store "contacts". Il lit les données et les affiche à l'utilisateur via une interface, avec une carte Google Maps de l'emplacement de l'utilisateur sélectionné, affiché dans un <iframe> pour contourner les restrictions CSP des applications certifiées.

Continuez à vous référer à ces exemples et lisez Utilisation de l'API Data Store pour des explications et des exemples de code.

Note: Sachez que pour tester des exemples de magasin de données, vous devez vous assurer que vos applications sont internes / certifiées (voir ci-dessus pour les champs de manifeste nécessaires) et utilisez App Manager ou WebIDE pour simuler un environnement dans lequel une application interne / certifiée peut être exécutée. Suivez ces liens pour savoir comment faire cela en utilisant chaque outil: App Manager: Debugger les applications certifiées et WebIDE: Debugger les applications certifiées.

Caractéristiques

Caractéristiques Statut Commentaires
API Data Store Brouillon

La discussion concernant la création de cette API a eu lieu dans diverses listes de diffusion Mozilla et ailleurs. Vous trouverez un résumé de la discussion et d'autres indications sur le Wiki de Mozilla. Pour plus d'informations et de questions, envoyez un courrier à la liste de diffusion dev-webapi.

Compatibilité

Supporté dans Firefox OS 1.0.1.
Disponible dans web workers dans Firefox OS 2.0.

Voir aussi