2012-05-04 5 views
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");}; 

私はdbを開いて、オブジェクトストアを読み込んで、dbを変更できるようにする必要があります。 1ページに1回だけDB構造を変更できるようです。indexedDBデータベースをfirefoxで開いた後で、その構造を変更することはできますか?

廃止予定のsetVersionメソッドを使用すると、これはChromeでうまく動作します。

+0

request.onblocked = function(){db.close(); }; このコンテキストでcloseを呼び出すと、onupgradeneededイベントが発生します。誰かが自分の髪を抜くのを救うはずです。 – anonymous

答えて

7

IndexedDB APIは使いやすいものではありません。いくつか:

1)dbへの他の開いている接続がない限り、アップグレードされません。 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 

ない場合:他のタブは、このDBへの接続をオープンしていないこと

  1. チェックを。
  2. 他の3つのイベントのハンドラを追加して、どちらが起動するかを確認します。
+1

ちょっといい人の答えです。あなたはそれについて100%正しいです。私はついにそれを働かせました。 idbで作業しなければならない人にとって、私はあなたに多くの時間を節約できます。バージョンを設定するためのメソッドを作成し、それを実行するために必要な処理を行うためにバージョンに依存します。 – anonymous

+0

オープニングを閉じたり、クロージング23を再び閉じたりすることはできません。それは私にかなりの嫌悪感をもたらしている。既に開いているDBを持つsetVersionはエラーを引き起こします。閉じた後、インクリメントされたバージョンで再び開くと、 'BLOCKED'エラーが発生します。 – hrdwdmrbl

+0

OH YEAH!閉じると、indexedDBを開くとChrome 26(Chrome Canary)で動作します。 – hrdwdmrbl

関連する問題