2016-09-07 19 views
2

以前に作成されたオブジェクトストアにアップグレード必要イベント内のインデックスを追加するにはどうすればよいですか?新しいオブジェクトストア上でこれを行うIndexedDB内の既存のオブジェクトストアへのインデックスの追加

が十分に立証されて:

request.onupgradeneeded = function(event) { 
    var db = event.target.result; 
    var objectStore = db.createObjectStore("my-store", 
    { keyPath: "id" } 
); 
    objectStore.createIndex("idx_name", "index_this", { unique: false }); 
}; 

しかし、どのように私は、私が以前に作成したオブジェクトストアにインデックスを追加することができますか?

request.onupgradeneeded = function(event) { 
    var db = event.target.result; 
    if (!db.objectStoreNames.contains("my-store")) { 
    var objectStore = db.createObjectStore("my-store", 
     { keyPath: "id" } 
    ); 
    } 
    var myStore = ?????????????; 
    if (!myStore.indexNames.contains("idx_name")) { 
    myStore.createIndex("idx_name", "index_this", { unique: false }); 
    } 
}; 

答えて

5

あなたは暗黙的にonupgradeneeded機能の範囲内から、あなたに提供されたトランザクションからオブジェクトストアへの参照を取得します。

function onupgradeneeded(event) { 
    var request = event.target; 
    var tx = request.transaction; 
    var store = tx.objectStore('store-name'); 
    store.createIndex(...); 
} 

あなたが唯一それが作成されている場合はストアを取得しようとするように、あなたのonupgradeneeded機能を書き換える必要があります覚えておいて、それがまだ作成されていない場合にのみインデックスを作成しようとしています。これを行うにはいくつかの方法があります。 1つはバージョン番号を使用することです。アップグレード前に存在していた古いバージョン、または新しい/現在のバージョンに対してテストすることができます。例えば。必要に応じてevent.oldVersionを使用してください。または、ストアが存在するかどうかをテストし、インデックスが存在するかどうかを個別にテストするには、db.objectStoreNames.containsを使用してストア名を検索し、インデックス名をstore.indexNames.containsにルックアップします。

+0

素晴らしい作品です、ありがとうございます!私が終わったコードは次のとおりです:https://gist.github.com/TalAter/45e0b87ee0cf8b65f943c4320b092b0e –

関連する問題