25

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;
    }
}
4

9 に答える 9

22

onupgradeneeded コールバックで、バージョンを確認できます。(e.target.result.oldversion)。0 の場合、データベースは存在しませんでした。

編集:いくつかの調査の後。新しいデータベースが作成されたかどうかを 100% 確信することはできません。私が確信していることの 1 つは、バージョン 1 以上の場合にのみ indexeddb を操作できるということです。私は、データベースが存在し、バージョン 0 を持つことができると信じています (唯一の事実は、データベースを操作できず、onupgradeneeded イベントが呼び出されることです)。

独自の indexeddbviewer を作成しました。その中で、バージョンなしで indexeddb を開き、onupgradeneeded イベントが発生した場合、それはデータベースが存在しないことを意味します。その場合、バージョン 1 にアップグレードしないように中止を呼び出します。これが私が確認する方法です。

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

しかし、述べたように。その場合、データベースが引き続き存在する可能性がありますが、onupgradeneeded は常に呼び出されます。

于 2013-07-04T15:32:17.697 に答える
5

私はそれで1時間以上遊んでいましたが、基本的にそれを行う唯一の決定論的で信頼できる方法は、webkitのwebkitGetDatabaseNames.

onupgradeneeded を使用して DB が存在するかどうかをテストする方法は文字通り 10 通りありますが、それは本番環境では機能しません。データベースを削除すると、数秒間ブロックされることもあれば、完全にブロックされることもあります。window.indexeddb.open("db")リクエストにトランザクションオブジェクトが含まれていないため、トランザクションを中止するためのこれらのヒントはナンセンス です...req.transaction == null

これが現実だなんて信じられない…

于 2014-12-05T23:21:11.410 に答える
2

この関数は、データベースが存在するかどうかをチェックします。onupgradeneeded イベントを使用します。バージョンが 1 でイベントがトリガーされた場合は、データベースが存在しないことを意味しますが、window.indexedDB.open(name) 関数で作成されているため、削除する必要があります。

onsuccess イベントが発生しても、onupgradeneeded イベントが発生しない場合 (変数 dbExists が true のまま)、データベースが以前に存在していたことを示し、true を返します。

/**
 * Check if a database exists
 * @param {string} name Database name
 * @param {function} callback Function to return the response
 * @returns {bool} True if the database exists
 */
function databaseExists(name, callback) {
  var dbExists = true;
  var request = window.indexedDB.open(name);
  request.onupgradeneeded = function (e) {
    if (request.result.version === 1) {
      dbExists = false;
      window.indexedDB.deleteDatabase(name);
      if (callback) callback(dbExists);
    }
  };
  request.onsuccess = function (e) {
    if (dbExists) {
      if (callback) callback(dbExists);
    }
  };
}

関数の出力は、コールバック関数を介して行われます。利用形態は以下の通りです。

var name = "TestDatabase";

databaseExists(name, function (exists) {
  if (exists) {
    console.debug("database " + name + " exists");
  } else {
    console.debug("database " + name + " does not exists");
  }
});

[私の英語でごめんなさい]

于 2014-03-23T22:51:19.757 に答える
-1

こんにちは、私はこの質問がすでに回答され、受け入れられていることを知っていますが、このようにする良い方法の1つだと思います

var indexeddbReq = $window.indexedDB.webkitGetDatabaseNames();
                indexeddbReq.onsuccess = function(evt){
                    if(evt.target.result.contains(
                       // SUCCESS YOU FOUND THE DB
                    }
                    else{
                       // DB NOT FOUND
                    }
                }
于 2015-07-12T13:16:17.650 に答える