Lucía, miembro de este equipo, nos hizo el favor de escribir este escrito porque controla a la perfección este tema.
Solución:
En la devolución de llamada onupgradeneeded puede comprobar la versión. (e.target.result.oldversion). Si es 0, la base de datos no existía.
Editar: Después de algunas investigaciones. No puede estar 100% seguro si se crea una nueva base de datos. Una cosa de la que estoy seguro es el hecho de que solo puede trabajar con un indexeddb si tiene una versión 1 o superior. Creo que puede existir una base de datos y tener una versión 0 (el único hecho es que no puede trabajar con ella y se llamará al evento onupgradeneeded).
He construido mi propio indexeddbviewer. En eso abro indexeddb sin versión y si entro en el evento onupgradeneeded, eso significa que el db no existe. En ese caso, llamo al aborto para que no se actualice a la versión 1. Esta es la forma en que lo verifico.
var dbExists = true;
var request = window.indexeddb.open("db");
request.onupgradeneeded = function (e)
e.target.transaction.abort();
dbExists = false;
pero como se menciona. Es posible que la base de datos siga existiendo en ese caso, pero siempre se llamará a onupgradeneeded
El siguiente código funciona. Lo he probado con Chrome, IE y Opera. Probado con bases de datos abiertas y cerradas localmente y con bases de datos de diferentes versiones, por lo que debería ser preciso. Es necesaria la creación/eliminación de la base de datos. Sin embargo, será una operación atómica sin riesgo de condiciones de carrera porque la especificación promete no iniciar solicitudes abiertas en paralelo si la solicitud abierta da como resultado la creación de una base de datos.
function databaseExists(dbname, callback)
var req = indexedDB.open(dbname);
var existed = true;
req.onsuccess = function ()
req.result.close();
if (!existed)
indexedDB.deleteDatabase(dbname);
callback(existed);
req.onupgradeneeded = function ()
existed = false;
Para usar la función, haga:
databaseExists(dbName, function (yesno)
alert (dbName + " exists? " + yesno);
);
Pasé más de una hora jugando con él y básicamente la única forma determinista y confiable de hacerlo es usando webkit webkitGetDatabaseNames
.
Literalmente, hay como 10 formas de probar si DB existe usando onupgradeneeded, pero eso simplemente no funciona en producción. Se bloqueó durante varios segundos, a veces por completo al eliminar la base de datos. Esos consejos para abortar la transacción no tienen sentido porque
window.indexeddb.open("db")
la solicitud no contiene el objeto de transacción… req.transaction == null
No puedo creer que esto sea real…
Si posees alguna suspicacia o forma de regenerar nuestro artículo te recordamos realizar una observación y con deseo lo observaremos.