IndexedDB es una API de bajo nivel para el almacenamiento en el lado del cliente de cantidades significativas de datos estructurados, incluidos archivos / blobs. Esta API utiliza índices para permitir búsquedas de alto rendimiento de estos datos. Si bien el almacenamiento web es útil para almacenar cantidades más pequeñas de datos, es menos útil para almacenar grandes cantidades de datos estructurados. IndexedDB proporciona una solución. Esta es la página de inicio principal para la cobertura de IndexedDB de MDN; aquí proporcionamos enlaces a las guías de uso y referencia de API completas, detalles de soporte del navegador y alguna explicación de key conceptos.

Nota: Esta función está disponible en Web Workers.

Nota: La API IndexedDB es poderosa, pero puede parecer demasiado complicada para casos simples. Si prefiere una API simple, pruebe las bibliotecas de la sección Consulte también que hacen que IndexedDB sea más fácil de usar para los programadores.

Conceptos y uso clave

IndexedDB es un sistema de base de datos transaccional, como un RDBMS basado en SQL. Sin embargo, a diferencia de los RDBMS basados ​​en SQL, que utilizan tablas de columnas fijas, IndexedDB es una base de datos orientada a objetos basada en JavaScript. IndexedDB le permite almacenar y recuperar objetos que están indexados con un key; se pueden almacenar todos los objetos admitidos por el algoritmo de clonación estructurada. Debe especificar el esquema de la base de datos, abrir una conexión a su base de datos y luego recuperar y actualizar los datos dentro de una serie de actas.

  • Lea más sobre los conceptos detrás de IndexedDB.
  • Aprenda a usar IndexedDB de forma asincrónica desde los primeros principios con nuestra guía Uso de IndexedDB.
  • Combine IndexedDB para almacenar datos fuera de línea con Service Workers para almacenar activos fuera de línea, como se describe en Hacer que las PWA funcionen sin conexión con los trabajadores del servicio.

Nota: Como la mayoría de las soluciones de almacenamiento web, IndexedDB sigue un política del mismo origen. Entonces, si bien puede acceder a los datos almacenados dentro de un dominio, no puede acceder a los datos en diferentes dominios.

Sincrónico y asincrónico

Las operaciones realizadas con IndexedDB se realizan de forma asincrónica, para no bloquear aplicaciones. IndexedDB originalmente incluía API síncronas y asincrónicas. La API síncrona estaba pensada para usarse solo con Web Workers, pero se eliminó de la especificación porque no estaba claro si era necesaria. Sin embargo, la API síncrona puede reintroducirse si hay suficiente demanda por parte de los desarrolladores web.

Límites de almacenamiento y criterios de desalojo

Hay una serie de tecnologías web que almacenan datos de un tipo u otro en el lado del cliente (es decir, en su disco local). IndexedDB es el que se habla más comúnmente. El proceso mediante el cual el navegador calcula cuánto espacio asignar al almacenamiento de datos web y qué eliminar cuando se alcanza ese límite no es simple y difiere entre los navegadores. Los límites de almacenamiento del navegador y los criterios de desalojo intentan explicar cómo funciona esto, al menos en el caso de Firefox.

Interfaces

Para obtener acceso a una base de datos, llame open() sobre el indexedDB attribute de un objeto de ventana. Este método devuelve un IDBRequest objeto; Las operaciones asincrónicas se comunican con la aplicación que llama disparando eventos en IDBRequest objetos.

Conectarse a una base de datos

IDBEnvironment
Proporciona acceso a la funcionalidad IndexedDB. Es implementado por el window y worker objetos. Esta interfaz no forma parte de la especificación 2.0.
IDBFactory
Proporciona acceso a una base de datos. Esta es la interfaz implementada por el objeto global indexedDB y, por tanto, es el punto de entrada de la API.
IDBOpenDBRequest
Representa una solicitud para abrir una base de datos.
IDBDatabase
Representa una conexión a una base de datos. Es la única forma de obtener una transacción en la base de datos.

Recuperar y modificar datos

IDBTransaction
Representa una transacción. Usted crea una transacción en una base de datos, especifica el alcance (por ejemplo, a qué almacenes de objetos desea acceder) y determina el tipo de acceso (solo lectura o lectura y escritura) que desea.
IDBRequest
Interfaz genérica que maneja las solicitudes de la base de datos y brinda acceso a los resultados.
IDBObjectStore
Representa un almacén de objetos que permite el acceso a un conjunto de datos en una base de datos IndexedDB, consultados a través de key.
IDBIndex
También permite el acceso a un subconjunto de datos en una base de datos IndexedDB, pero utiliza un índice para recuperar los registros en lugar del principal. key. A veces, esto es más rápido que usar IDBObjectStore.
IDBCursor
Itera sobre índices y almacenes de objetos.
IDBCursorWithValue
Itera sobre almacenes e índices de objetos y devuelve el valor actual del cursor.
IDBKeyRange
Define un key rango que se puede utilizar para recuperar datos de una base de datos en un rango determinado.
IDBLocaleAwareKeyRange Esta API no se ha estandarizado.
Define un key rango que se puede usar para recuperar datos de una base de datos en un rango determinado, ordenados de acuerdo con las reglas de la configuración regional especificada para un índice determinado (consulte createIndex()Parámetros opcionales). Esta interfaz no forma parte de la especificación 2.0.

Interfaces de eventos personalizados

Esta especificación activa eventos con la siguiente interfaz personalizada:

IDBVersionChangeEvent
los IDBVersionChangeEvent interfaz indica que la versión de la base de datos ha cambiado, como resultado de una IDBOpenDBRequest.onupgradeneeded función de controlador de eventos.

Interfaces obsoletas

Una versión anterior de la especificación también definía las siguientes interfaces, ahora eliminadas. Todavía están documentados en caso de que necesite actualizar el código escrito anteriormente:

IDBVersionChangeRequest Esta API obsoleta ya no debería usarse, pero probablemente seguirá funcionando.
Representa una solicitud para cambiar la versión de una base de datos. La forma de cambiar la versión de la base de datos ha cambiado desde entonces (llamando IDBFactory.open sin llamar también IDBDatabase.setVersion) y la interfaz IDBOpenDBRequest ahora tiene la funcionalidad de la eliminada IDBVersionChangeRequest.
IDBDatabaseException Esta API obsoleta ya no debería usarse, pero probablemente seguirá funcionando.
Representa las condiciones de excepción que se pueden encontrar al realizar operaciones de base de datos.
IDBTransactionSync Esta API obsoleta ya no debería usarse, pero probablemente seguirá funcionando.
Sincronizar versión de IDBTransaction.
IDBObjectStoreSync Esta API obsoleta ya no debería usarse, pero probablemente seguirá funcionando.
Sincronizar versión de IDBObjectStore.
IDBIndexSync Esta API obsoleta ya no debería usarse, pero probablemente seguirá funcionando.
Sincronizar versión de IDBIndex.
IDBFactorySync Esta API obsoleta ya no debería usarse, pero probablemente seguirá funcionando.
Sincronizar versión de IDBFactory.
IDBEnvironmentSync Esta API obsoleta ya no debería usarse, pero probablemente seguirá funcionando.
Sincronizar versión de IDBEnvironment.
IDBDatabaseSync Esta API obsoleta ya no debería usarse, pero probablemente seguirá funcionando.
Sincronizar versión de IDBDatabase.
IDBCursorSync Esta API obsoleta ya no debería usarse, pero probablemente seguirá funcionando.
Sincronizar versión de IDBCursor.

Ejemplos de

Especificaciones

Especificación Estado Comentario
API de base de datos indexada 2.0 Recomendación
API de base de datos indexada 2.0 Recomendación Definición inicial

Ver también

  • localForage: Un Polyfill que proporciona una sintaxis simple de nombre: valor para el almacenamiento de datos del lado del cliente, que usa IndexedDB en segundo plano, pero recurre a WebSQL y luego a localStorage en navegadores que no admiten IndexedDB.
  • Dexie.js: Un contenedor para IndexedDB que permite un desarrollo de código mucho más rápido a través de una sintaxis simple y agradable.
  • ZangoDB: Una interfaz similar a MongoDB para IndexedDB que admite la mayoría de las funciones familiares de filtrado, proyección, clasificación, actualización y agregación de MongoDB.
  • JsStore: Un contenedor IndexedDB con sintaxis similar a SQL.
  • MiniMongo: Un mongodb en memoria del lado del cliente respaldado por almacenamiento local con sincronización del servidor a través de http. MiniMongo es utilizado por MeteorJS.
  • PouchDB: Una implementación del lado del cliente de CouchDB en el navegador usando IndexedDB
  • idb: Una biblioteca pequeña (~ 1.15k) que en su mayoría refleja la API IndexedDB, pero con pequeñas mejoras que marcan una gran diferencia en la usabilidad.
  • idb-keyval: Un almacén de valores de claves basado en promesas súper simple y pequeño (~ 600B) implementado con IndexedDB
  • sifrr-almacenamiento: Una pequeña biblioteca basada en promesas (~ 2kB) para el lado del cliente key-Almacenamiento de valores. Funciona con IndexedDB, localStorage, WebSQL, Cookies. Puede utilizar automáticamente el almacenamiento compatible disponible según la prioridad.
  • tierra de amor: Lovefield es una base de datos relacional para aplicaciones web. Escrito en JavaScript, funciona en varios navegadores. Proporciona API similares a SQL que son rápidas, seguras y fáciles de usar.