IndexedDB
IndexedDB est une API de bas niveau qui permet le stockage côté client de quantités importantes de données structurées, incluant des fichiers/blobs. Cette API utilise des index afin de permettre des recherches performantes sur ces données. Alors queWeb Storage est utile pour stocker de petites quantités de données, il est moins utile pour stocker de grandes quantités de données structurées. IndexedDB fournit une solution. Cette page est le point d'entrée pour tout ce qui concerne IndexedDB sur MDN - vous y trouverez les liens vers la référence complète de l'API et les guides d'utilisation, le support par les navigateurs, et quelques explications des concepts clés.
Note : Cette fonctionnalité est disponible via lesWeb Workers.
Note :L'API IndexedDB est puissante, mais elle peut sembler trop compliquée dans les cas simples. Si vous préferez une API plus simple, essayez des librairies commelocalForage,dexie.js,ZangoDB,PouchDB,idb,idb-keyval,JsStore etlovefield qui offrent de nombreux avantages aux développeurs de IndexedDB.
Concepts clés et utilisation
IndexedDB est un système de gestion de base de données transactionnel, similaire à un SGBD relationnel basé sur SQL. Cependant contrairement aux SGBD relationnels, qui utilisent des tables avec des colonnes fixes, IndexedDB est une base de données orientée objet basée sur JavaScript. IndexedDB vous permet de stocker et de récupérer des objets qui sont indexés avec uneclef; tout objet supporté parl'algorithme de clônage structuré peut être stocké. Vous devez spécifier le schéma de la base de données, ouvrir une connexion à votre base de données, puis récupérer et mettre à jour des données dans une série detransactions.
- Plus d'informations sur lesconcepts derrière IndexedDB.
- Apprenez à utiliser IndexedDB de manière asynchrone à partir des principes fondamentaux grâce à notre guideUtiliser IndexedDB.
- Combinez IndexedDB pour le stockage des données en mode déconnecté avec les Service Workers pour stocker des assets en mode déconnecté, comme précisé dansFaire fonctionner les PWAs en mode déconnecté grâce aux Service workers.
Note :Comme la plupart des solutions de stockage en ligne, IndexedDB suit la politiquesame-origin policy. Alors même que vous pouvez accèder à des données stockées au sein d'un domaine, vous ne pouvez pas accéder à des données sur plusieurs domaines.
Synchrone et asynchrone
Les opérations effectuées par IndexedDB sont réalisées de manière asynchrone, afin de ne pas bloquer l'application. IndexedDB comprend à la fois une API asynchrone et une API synchrone. L'API synchrone était à l'origine uniquement destinée pour un usage avec lesWeb workers, mais elle a été retirée de la spécification parce qu'il était difficile de savoir si elle était nécessaire. Cependant l'API synchrone pourrait être ré-integrée si il y a une demande suffisante de la part des développeurs web.
Limites de stockage et critères d'éviction
Il y a un certain nombre de technologies web pour stocker différents types de données côté client (par exemple, sur votre disque local). IndexedDB est la plus couramment citée. Le processus par lequel le navigateur calcule combien d'espace il doit allouer aux données web, et ce qu'il doit supprimer quand la limite est atteinte, n'est pas simple et varie entre les différents navigateurs. L'articleLimites de stockage du navigateur et critères d'éviction tente d'expliquer ce fonctionnement, au moins pour le cas de Firefox.
Interfaces
Pour accèder à une base de données, il faut apelleropen()
sur l'attributindexedDB
d'un objetwindow. Cette méthode retourne un objetIDBRequest
; Les opérations asynchrones communiquent avec l'application appelante en déclenchant des évènements sur les objetsIDBRequest
.
Se connecter à la base de données
IDBEnvironment
Fournit un accès aux fonctionnalités d'IndexedDB. Implémenté par les objets
window
etworker
.IDBFactory
Fournit un accès à la base de données.C'est l'interface implémentée par l'objet global
indexedDB
et c'est donc le point d'entrée de l'API.IDBOpenDBRequest
Représente une requête d'ouverture de la base de données.
IDBDatabase
Représente une connexion à la base de données. C'est le seul moyen d'obtenir une transaction sur la base de données.
Récupérer et modifier les données
IDBTransaction
Représente une transaction. Vous créez une transaction sur la base de données, spécifiez la portée (comme à quel magasin d'objets vous souhaitez accèder), et déterminez le type d'accès désiré (lecture seule ou lecture et écriture).
IDBRequest
Interface générique qui récupère les requêtes à la base de données et fournit un accès aux résultats.
IDBObjectStore
Représente un magasin d'objets qui permet l'accès à un ensemble de données d'une base de données IndexedDB, recherché par clé primaire.
IDBIndex
Permet aussi d'accèder à un sous-ensemble de données d'une base IndexedDB mais utilise un index pour récupérer les enregistrements, au lieu d'une clé primaire. C'est parfois plus rapide qu'un usage de
IDBObjectStore
.IDBCursor
Itérateur sur les magasins d'objets et les index.
IDBCursorWithValue
Itérateur sur les magasins d'objets et les index et retourne la valeur courante du curseur.
IDBKeyRange
Définit une portée de valeurs qui peut être utilisée pour récupérer des données de la base de données dans une certaine portée.
IDBLocaleAwareKeyRange
Non standardDéfinit une portée de valeurs qui peut être utilisée pour récupérer des données de la base de données dans une certaine portée, triées en fonction des règles de la localisation spécifiée pour un certain index (voir
createIndex()
's optionalParameters).
Interfaces d'événements personnalisés
Cette spécification provoque des évènements avec les interfaces personnalisées suivantes:
IDBVersionChangeEvent
L'interface IDBVersionChangeEvent
indique que la version de la base de données à changé, résultat de la fonction de saisie d'un évènementIDBOpenDBRequest.onupgradeneeded
.
Interfaces obsolètes
Une précedente version des spécifications a défini ces interfaces, désormais supprimées. Elles sont toujours documentées dans le cas où vous avez besoin de mettre à jour du code déja écrit :
IDBVersionChangeRequest
ObsolèteReprésente une requête de changement de version de la base de données. Le moyen pour changer de version de la base de données a désormais changé (avec un appel de
IDBFactory.open
sans aussi appelerIDBDatabase.setVersion
), et l'interfaceIDBOpenDBRequest
a désormais la fonction de l'ancienne (supprimée)IDBVersionChangeRequest
.IDBDatabaseException
ObsolèteReprésente une exception (erreur) qui peut survenir durant les opérations sur la base de données.
IDBTransactionSync
ObsolèteVersion synchrone de
IDBTransaction
.IDBObjectStoreSync
ObsolèteVersion synchrone de
IDBObjectStore
.IDBIndexSync
ObsolèteVersion synchrone de
IDBIndex
.IDBFactorySync
ObsolèteVersion synchrone de
IDBFactory
.IDBEnvironmentSync
ObsolèteVersion synchrone de
IDBEnvironment
.IDBDatabaseSync
ObsolèteVersion synchrone de
IDBDatabase
.IDBCursorSync
ObsolèteVersion synchrone de
IDBCursor
.
Exemples
- eLibri: Une application puissante de bibliothèque et de lecteur de livres électroniques, écrit par Marco Castelluccio, gagnant duDevDerby IndexedDB de Mozilla.
- To-do Notifications (voir la démonstration en ligne): L'application de référence pour les exemples de la documentation.
- Stocker des images et des fichiers dans IndexedDB
Spécifications
Specification |
---|
Indexed Database API 3.0 |
Voir aussi
- localForage: UnPolyfill fournissant une syntaxe clé-valeurs simple pour un stockage côté client; il utilise IndexedDB en arrière plan, mais se retourne d'abord sur WebSQL puis sur localStorage pour les navigateurs qui ne supportent pas IndexedDB.
- dexie.js : Unwrapper pour IndexedDB qui permet un développement plus rapide avec une syntaxe simple.
- ZangoDB : Une interface comme MongoDB pour IndexedDB qui prend en charge la plupart des fonctionnalités familières de filtrage, projection, tri, mise à jour et agrégation de MongoDB.
- JsStore : Un contenu IndexedDB avec SQL comme syntaxe.
- MiniMongo
- PouchDB