Búsqueda de sitios web

javascript - Verificar e Incrementar el Número de Versión de un IndexedDB


Tengo un IndexedDB que está almacenando una gran cantidad de datos dinámicos. (Los datos estáticos ya están en caché mediante un Service Worker)

Mi problema es que, dado que estos datos son dinámicos, necesito que IndexedDB se borre y se restaure cada vez que se abre la aplicación. Para esto, necesito que el número de versión se incremente para que se dispare el evento onupgradeneeded. No puedo pensar en ninguna manera lógica de hacer esto, e incluso usando la siguiente llamada en el evento onupgradeneeded obtengo una respuesta indefinida.

e.target.result.oldversion

Mi código de IndexedDB es el siguiente, con los parámetros siendo: Clave - El nombre del objeto JSON que se almacenará en la base de datos. Valor - El propio objeto JSON.

function dbInit(key, value) {
// Open (or create) the database

var open = indexedDB.open("MyDatabase", 1);

console.log(value);

// Create the schema
open.onupgradeneeded = function(e) {
    console.log("Old Version: " + e.target.result.oldversion); //Undefined
    console.log("New Version: " + e.target.result.newversion); //Undefined
    var db = open.result;
    var store = db.createObjectStore("Inspections", {keyPath: "id", autoIncrement: true});
    var index = store.createIndex(key, key);
};

open.onsuccess = function() {

    // Start a new transaction
    var db = open.result;
    var tx = db.transaction("Inspections", "readwrite");
    var store = tx.objectStore("Inspections");
    var index = store.index(key);

    store.add(value);

    // Close the db when the transaction is done
    tx.oncomplete = function() {
        db.close();
    };
  }
}

Como este método se llama varias veces para varios objetos 'Key', necesitaré encontrar una manera de incrementar este número de versión una vez por apertura de la página, y luego mover la llamada 'add' fuera del método onupgradeneeded, pero por el momento la prioridad es asegurarse de que se ejecute una vez: incrementando el número de versión, disparando el onupgradeneeded, eliminando los datos actuales y almacenando los nuevos datos.

¡Gracias de antemano!

Respuesta #1

Las propiedades oldVersion y newVersion (nota la capitalización) están en el IDBVersionChangeEvent, no en el IDBDatabase. En otras palabras, esto:

console.log("Old Version: " + e.target.result.oldversion); //Undefined
console.log("New Version: " + e.target.result.newversion); //Undefined

debería ser:

console.log("Old Version: " + e.oldVersion);
console.log("New Version: " + e.newVersion);

Dicho esto... estás usando la versionado de esquemas de una manera algo atípica. Si realmente quieres empezar con una base de datos nueva cada vez que se abre la página, simplemente elimina antes de abrir:

indexedDB.deleteDatabase("MyDatabase");
var open = indexedDB.open("MyDatabase", 1);
// An open/delete requests are always processed in the order they
// are made, so the open will wait for the delete to run.

Tenga en cuenta que las operaciones en cola (eliminar y abrir) serían bloqueadas si otra pestaña mantenía una conexión abierta y no respondía a un evento versionchange enviado en respuesta a la solicitud de eliminación. Tal vez eso sea algo bueno en su caso: evitaría que dos pestañas trabajaran en la base de datos simultáneamente.

Un patrón de uso más típico sería cambiar la versión solo cuando la aplicación web se actualiza y el esquema de la base de datos es diferente. Si realmente necesitaras borrar los datos entre sesiones, lo harías al abrir la aplicación, en lugar de al actualizar, y usarías cosas como clear() en el almacén de objetos. Pero ahora estamos entrando en el diseño de tu aplicación, que parece que tienes bien controlado.