0
var db;
var version = 1;
var request = indexedDB.open("myDB", version);
request.onsuccess(function(e) {db = e.target.result;});
// db.close(); //??? happens async and has no callback
var request2 = indexedDB.open("myDB", ++version);
request.onsuccess = function() { console.log("success"); };
request.onerror = function() { console.log("error"); }; // called if db existed when page was loaded
request.onblocked = function(){console.log("blocked");}; // called on init creation
request.onupgradeneeded = function(){console.log("onupgradeneeded");};

データベースを開き、オブジェクト ストアを読み取り、データベースを変更できる必要があります。ページの読み込みごとに 1 回しかデータベース構造を変更できないようです。

非推奨の setVersion メソッドを使用する場合、これは Chrome で問題なく機能します。

4

1 に答える 1

7

IndexedDB API は使いにくいです。いくつかのこと:

1) upgradeneeded は、データベースへの他のオープン接続がなくなるまで起動しません。db.close() 行のコメントを外します。ただし、リクエストが成功イベントを受け取るまで db は IDBDatabase オブジェクトにならないため、それを待つ必要があります。

2) request2 オブジェクトにはイベント ハンドラがありません。おそらく、コード サンプルの最後の 4 行に request の代わりに request2 を配置するつもりでした。

3) 最初の request.onsuccess 割り当てが間違っています。

4) ディスク上のデータベースのバージョンが、開くために渡したバージョンよりも新しい場合、エラー ハンドラが呼び出されます。

これを試して:

indexedDB = indexedDB || mozIndexedDB;
var db;
var request = indexedDB.open("myDB");
request.onsuccess = function(e) {
    db = e.target.result;
    var version = db.version;
    db.close();
    var request2 = indexedDB.open("myDB", ++version);
    request2.onsuccess = function() { console.log("success"); };
    request2.onerror = function() { console.log("error"); };
    request2.onblocked = function() { console.log("blocked"); };
    request2.onupgradeneeded = function() { console.log("onupgradeneeded"); };
};

コンソールに次のように表示されます。

onupgradeneeded
success

そうでない場合:

  1. 他のタブでこのデータベースへの接続が開かれていないことを確認してください。
  2. 要求する他の 3 つのイベントのハンドラーを追加し、どれが起動するかを確認します。
于 2012-05-06T00:34:06.970 に答える