Buscar..
Observaciones
Actas
Las transacciones deben usarse inmediatamente después de que se crean. Si no se usan en el bucle de eventos actual (básicamente, antes de que esperemos algo como una solicitud web), entrarán en un estado inactivo en el que no se pueden usar.
Las bases de datos solo pueden tener una transacción que se escribe en un almacén de objetos en particular a la vez. Por lo tanto, puede tener tantos como quiera que lea en nuestra tienda de things
, pero solo uno puede hacer cambios en un momento dado.
Prueba de disponibilidad de IndexedDB
Puede probar la compatibilidad con IndexedDB en el entorno actual comprobando la presencia de la propiedad window.indexedDB
:
if (window.indexedDB) {
// IndexedDB is available
}
Abriendo una base de datos
Abrir una base de datos es una operación asíncrona. Necesitamos enviar una solicitud para abrir nuestra base de datos y luego escuchar los eventos para que podamos saber cuándo está lista.
Abriremos una base de datos DemoDB. Si aún no existe, se creará cuando enviemos la solicitud.
El 2
continuación dice que estamos pidiendo la versión 2 de nuestra base de datos. Solo existe una versión en cualquier momento, pero podemos usar el número de versión para actualizar los datos antiguos, como verá.
var db = null, // We'll use this once we have our database
request = window.indexedDB.open("DemoDB", 2);
// Listen for success. This will be called after onupgradeneeded runs, if it does at all
request.onsuccess = function() {
db = request.result; // We have a database!
doThingsWithDB(db);
};
// If our database didn't exist before, or it was an older version than what we requested,
// the `onupgradeneeded` event will be fired.
//
// We can use this to setup a new database and upgrade an old one with new data stores
request.onupgradeneeded = function(event) {
db = request.result;
// If the oldVersion is less than 1, then the database didn't exist. Let's set it up
if (event.oldVersion < 1) {
// We'll create a new "things" store with `autoIncrement`ing keys
var store = db.createObjectStore("things", { autoIncrement: true });
}
// In version 2 of our database, we added a new index by the name of each thing
if (event.oldVersion < 2) {
// Let's load the things store and create an index
var store = request.transaction.objectStore("things");
store.createIndex("by_name", "name");
}
};
// Handle any errors
request.onerror = function() {
console.error("Something went wrong when we tried to request the database!");
};
Añadiendo objetos
Cualquier cosa que deba suceder con los datos en una base de datos IndexedDB sucede en una transacción. Hay algunas cosas que se deben tener en cuenta sobre las transacciones que se mencionan en la sección de Comentarios al final de esta página.
Usaremos la base de datos que configuramos en Abrir una base de datos.
// Create a new readwrite (since we want to change things) transaction for the things store
var transaction = db.transaction(["things"], "readwrite");
// Transactions use events, just like database open requests. Let's listen for success
transaction.oncomplete = function() {
console.log("All done!");
};
// And make sure we handle errors
transaction.onerror = function() {
console.log("Something went wrong with our transaction: ", transaction.error);
};
// Now that our event handlers are set up, let's get our things store and add some objects!
var store = transaction.objectStore("things");
// Transactions can do a few things at a time. Let's start with a simple insertion
var request = store.add({
// "things" uses auto-incrementing keys, so we don't need one, but we can set it anyway
key: "coffee_cup",
name: "Coffee Cup",
contents: ["coffee", "cream"]
});
// Let's listen so we can see if everything went well
request.onsuccess = function(event) {
// Done! Here, `request.result` will be the object's key, "coffee_cup"
};
// We can also add a bunch of things from an array. We'll use auto-generated keys
var thingsToAdd = [{ name: "Example object" }, { value: "I don't have a name" }];
// Let's use more compact code this time and ignore the results of our insertions
thingsToAdd.forEach(e => store.add(e));
Recuperando datos
Cualquier cosa que deba suceder con los datos en una base de datos IndexedDB sucede en una transacción. Hay algunas cosas que se deben tener en cuenta sobre las transacciones que se mencionan en la sección de Comentarios al final de esta página.
Usaremos la base de datos que configuramos en Abrir una base de datos.
// Create a new transaction, we'll use the default "readonly" mode and the things store
var transaction = db.transaction(["things"]);
// Transactions use events, just like database open requests. Let's listen for success
transaction.oncomplete = function() {
console.log("All done!");
};
// And make sure we handle errors
transaction.onerror = function() {
console.log("Something went wrong with our transaction: ", transaction.error);
};
// Now that everything is set up, let's get our things store and load some objects!
var store = transaction.objectStore("things");
// We'll load the coffee_cup object we added in Adding objects
var request = store.get("coffee_cup");
// Let's listen so we can see if everything went well
request.onsuccess = function(event) {
// All done, let's log our object to the console
console.log(request.result);
};
// That was pretty long for a basic retrieval. If we just want to get just
// the one object and don't care about errors, we can shorten things a lot
db.transaction("things").objectStore("things")
.get("coffee_cup").onsuccess = e => console.log(e.target.result);