2013-09-04 5 views
7

に基づいのIndexedDBで複数のレコードを削除する:は(を装備(異なる機器、主キーtagNoを表す)とequipParts機器の一部の部分を表し、タグ番号/シリアル番号、プライマリキーseqNoに基づいて、フィールドがタグNoであるインデックスを持ち、その一部がその一部である)。私はのIndexedDBを使用していると私は、2つのオブジェクトストアを有する指標

私はを装備でレコードを削除した場合、私はequipParts tagNoベアリングのすべてのレコードを削除するには、(単に「ここでequipParts.tagNo = equip.tagNo」のような)を装備します。私のコードから

抜粋:

var tx = db.transaction(["equip", "equipParts"],"readwrite"); 
var estore = tx.objectStore("equip"); 
var pstore = tx.objectStore("equipParts"); 
var tagIndex = pstore.index("by_tagNo"); 
var pdestroy = tagIndex.openCursor(IDBKeyRange.only(tagno)); //opens all records bearing the selected tag number 
pdestroy.onsuccess = function() { 
    var cursor = pdestroy.result; 
    if (cursor) { 
     if (cursor.value.tagNo == tagno) { 
      pstore.delete(cursor.value.seqNo); //I guess I'm wrong here 
     } 
     cursor.continue; 
    } 
} 
pdestroy.onerror = function() { 
    alert("Deletion attempt NG"); 
} 
var ereq = estore.delete(tagno); 
ereq.onsuccess = function(e) { 
    alert("Form deletion OK"); 
    window.location = "index.html"; 
} 
ereq.onerror = function(e) { 
    alert("Form deletion NG"); 
    window.location = "index.html"; 
} 
db.close(); 

問題が装備で唯一のレコードが削除されていることです。レコードはのequipPartsにとどまります。一意ではないインデックス(親オブジェクトストアの主キー)に基づいてIndexedDBオブジェクトストア内の複数のレコードを削除する方法はありますか?

答えて

8

レコードを削除するには、主キーを取得する必要があります。また

var pdestroy = tagIndex.openKeyCursor(IDBKeyRange.only(tagno)); 
pdestroy.onsuccess = function() { 
    var cursor = pdestroy.result; 
    if (cursor) { 
     pstore.delete(cursor.primaryKey); 
     cursor.continue; 
    } 
} 

ではなく、効率的な

var pdestroy = tagIndex.openCursor(IDBKeyRange.only(tagno)); 
pdestroy.onsuccess = function() { 
    var cursor = pdestroy.result; 
    if (cursor) { 
     cursor.delete(); 
     cursor.continue; 
    } 
} 
+1

なぜ二つ目は効率的ではないでしょうか? –

+1

'openCursor'は' IDBCursorWithValue'を返します。これはレコードの値を読み取る必要がありますが、最初のレコードはレコードの値を持たない 'IDBCursor'を返します。 –

+1

ありがとうございます。それは本当ですか?後で、同じトランザクション内で全体の削除が行われますか? –

関連する問題