检查IndexedDB数据库是否存在

Ped*_*ida 16 indexeddb

有没有办法检查IndexedDB数据库是否已经存在?当程序尝试打开不存在的数据库时,将创建数据库.我能想到的唯一方法是如下所示,我测试objectStore是否已经存在,如果没有,则删除数据库:

var dbexists=false;
var request = window.indexedDB.open("TestDatabase");
request.onupgradeneeded = function(e) {
    db = e.target.result;
    if (!db.objectStoreNames.contains('todo')) {
       db.close();
       indexedDB.deleteDatabase("TestDatabase");
    } else {
       dbexists=true;
    }
}
Run Code Online (Sandbox Code Playgroud)

Kri*_*ave 15

在onupgradeneeded回调中,您可以检查版本.(e.target.result.oldversion).如果为0,则db不存在.

编辑:经过一番调查.如果创建了新的数据库,则无法100%确定.我确信的一件事是,如果indexeddb的版本为1或更高版本,则只能使用它.我相信,一个数据库可以存在,并有一个版本0(唯一的事实是,你不能用它和onupgradeneeded事件工作会被调用).

我已经构建了自己的indexeddbviewer.在那里我打开没有版本的indexeddb,如果我进入onupgradeneeded事件,这意味着db不存在.在这种情况下,我调用中止,因此它不会升级到版本1.这是我检查它的方式.

var dbExists = true;
var request = window.indexeddb.open("db");
request.onupgradeneeded = function (e){
    e.target.transaction.abort();
    dbExists = false;
}
Run Code Online (Sandbox Code Playgroud)

但如上所述.在这种情况下,db可能会继续存在,但始终会调用onupgradeneeded


Dav*_*der 6

以下代码有效。我已经使用Chrome,IE和Opera对其进行了测试。已在本地打开的数据库和关闭的数据库以及不同版本的数据库中进行了测试,因此它应该是准确的。需要创建/删除数据库。但是,这将是原子操作,不会出现竞争条件,因为如果打开请求导致数据库创建,那么该规范承诺不会并行启动以打开打开请求。

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

要使用该功能,请执行以下操作:

databaseExists(dbName, function (yesno) {
    alert (dbName + " exists? " + yesno);
});
Run Code Online (Sandbox Code Playgroud)

  • WTF?为什么删除数据库(如果存在)?我们正在测试它是否存在,如果不想删除它。如果(!existed)indexedDB.deleteDatabase(dbname);应该不是吗? (6认同)

Ben*_*uer 6

使用 ES6,您可以使用以下代码按名称查找 IndexedDB 数据库:

const dbName = 'TestDatabase';
const isExisting = (await window.indexedDB.databases()).map(db => db.name).includes(dbName);

Run Code Online (Sandbox Code Playgroud)

  • 遗憾的是 `indexedDB.databases` [在 Firefox 中不可用](https://developer.mozilla.org/en-US/docs/Web/API/IDBFactory/databases#browser_compatibility) :( (4认同)

lis*_*sak 5

我花了一个多小时玩它,基本上唯一确定性和可靠的方法是使用 webkit 的webkitGetDatabaseNames.

从字面上看,有 10 种方法可以使用 onupgradeneeded 测试数据库是否存在,但这在生产中不起作用。它被阻塞了几秒钟,有时完全是因为删除数据库。那些中止事务的提示是无稽之谈,因为 window.indexeddb.open("db")请求不包含事务对象......req.transaction == null

我不敢相信这是真的...