IndexedDB en JavaScript
IndexedDB es una API de almacenamiento del lado del cliente potente y robusta, más que otras soluciones de almacenamiento local disponibles en los navegadores web. Permite almacenar y manipular grandes cantidades de datos estructurados de forma asíncrona mediante aplicaciones web. IndexedDB es ideal para aplicaciones que requieren almacenamiento de datos sin conexión, alto rendimiento y capacidades de consulta avanzadas sin depender de una conexión de red.
Configuración de una base de datos IndexedDB
Paso 1: Abrir una base de datos
Para usar IndexedDB, el primer paso es abrir una base de datos. Así es como puedes crear o abrir una base de datos IndexedDB. Después de una operación exitosa, cerramos la base de datos para evitar efectos secundarios no deseados en otros ejemplos. Puedes omitir este paso en tu propio código, o incluirlo si es necesario.
Advertencia: Llamar a deleteDatabase() borrará todos los datos de esta base de datos. Esto es solo para fines de prueba y no debe usarse en producción.
Paso 2: Crear almacenes de objetos
Una vez abierta la base de datos, puedes proceder a crear un almacén de objetos, que es similar a una tabla en las bases de datos relacionales. Ten en cuenta que esto solo se puede hacer durante una actualización de versión (al abrir la base de datos con un número de versión mayor). El evento que debes escuchar es onupgradeneeded.
Transacciones
Una vez configuradas tu base de datos y los almacenes de objetos, necesitarás gestionar las operaciones de datos mediante transacciones. Una transacción en IndexedDB es un mecanismo que agrupa múltiples operaciones en una única unidad de trabajo que tiene éxito por completo o falla por completo. Es esencial para garantizar la consistencia e integridad de los datos, especialmente cuando múltiples operaciones dependen unas de otras para producir un resultado correcto.
Cómo usar transacciones en IndexedDB
Paso 1: Iniciar una transacción
Para realizar cualquier operación en IndexedDB, comienza creando una transacción en una base de datos. Una transacción se crea especificando qué almacenes de objetos involucrará y el modo de la transacción, que puede ser "readonly" o "readwrite".
Paso 2: Acceder a un almacén de objetos
Dentro de una transacción, puedes acceder a uno o más almacenes de objetos para realizar operaciones de datos.
Paso 3: Realizar operaciones
Una vez que tengas acceso a un almacén de objetos, puedes ejecutar varias operaciones como agregar, recuperar, actualizar o eliminar datos. Cada operación devuelve un objeto de solicitud que puedes usar para manejar eventos de éxito o error.
Paso 4: Completar la transacción
Una transacción se completará automáticamente una vez que todas las operaciones emitidas en ella se hayan resuelto, ya sea con éxito o fallando. También puedes escuchar el evento complete en la transacción para realizar acciones después de que todas las operaciones hayan terminado con éxito.
Aquí tienes un ejemplo de una transacción completa:
Lectura de datos
Para recuperar datos, usa store.get(key) o un cursor para iterar sobre varios registros. Aquí tienes ejemplos rápidos:
Recuperar un solo registro:
Iterar con un cursor:
Actualización y eliminación de registros
Para modificar datos existentes, usa store.put() con la misma clave. Para eliminar datos, usa store.delete(key).
Actualizar un registro:
Eliminar un registro:
Cómo ver el contenido de IndexedDB en tu navegador
Después de almacenar y manipular datos, es posible que quieras inspeccionar lo que realmente se ha guardado en tu navegador. La mayoría de los navegadores modernos te muestran lo que está almacenado en IndexedDB. A continuación se muestra un ejemplo de las herramientas de desarrollo de Chrome:

Mejores prácticas para usar transacciones
Para garantizar que tu implementación de IndexedDB sea confiable y tenga buen rendimiento, sigue estas directrices:
- Minimiza el alcance: Mantén las transacciones lo más pequeñas posible, tanto en número de operaciones como en duración. Esto reduce la probabilidad de conflictos y mejora el rendimiento.
- Manejo de errores: Implementa siempre el manejo de errores tanto a nivel de solicitud como de transacción. Esto ayuda a diagnosticar problemas y prevenir actualizaciones parciales que podrían provocar corrupción de datos.
- Concurrencia: Comprende que, aunque IndexedDB es asíncrono y no bloqueante, las transacciones en la misma base de datos se encolan y ejecutan de forma serial para evitar carreras de datos e inconsistencias.
Conclusión
IndexedDB proporciona una plataforma robusta para la gestión compleja de datos en aplicaciones web, lo que la convierte en una herramienta esencial para los desarrolladores web modernos. Mediante la implementación adecuada de sus funciones, los desarrolladores pueden almacenar, recuperar, actualizar y eliminar datos del lado del cliente de manera eficiente, mejorando el rendimiento de la aplicación y la experiencia del usuario.
Práctica
¿Cuáles son las características de IndexedDB en JavaScript?