2013-09-04 17 views
7

Używam IndexedDB i mam dwa sklepy obiektu: wyposażyć (reprezentuje inny sprzęt, klucz podstawowy tagNo) i equipParts (oznacza części sprzętem i ma indeks, który jest oparty na numerze znacznika/numerze seryjnym, klucz podstawowy seqNo, z polem tagNo, który reprezentuje sprzęt, którego część stanowi część).Usuwanie wielu rekordów w IndexedDB na podstawie indeksu

Jeśli usunę rekordu w wyposażyć, chcę usunąć wszystkie rekordy w equipParts nosząca tagNo z wyposażyć (podobnie jak „gdzie equipParts.tagNo = equip.tagNo”).

Wyciąg z mojego kodu:

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(); 

Problemem jest to, że zostanie usunięty tylko zapis w wyposażyć; rekordy w equipParts pozostają tam. Czy istnieje sposób usuwania wielu rekordów w magazynie obiektów IndexedDB na podstawie nieunikalnego indeksu (który może być kluczem podstawowym nadrzędnego magazynu obiektów)?

Odpowiedz

8

Musisz uzyskać klucze podstawowe, aby usunąć rekordy.

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

Alternatywnie, ale nie efektywne

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

Dlaczego jest drugim nie wydajny? –

+1

'openCursor' zwraca' IDBCursorWithValue', który wymaga odczytu wartości rekordu, natomiast pierwszy zwraca 'IDBCursor' bez wartości rekordu. –

+1

Dzięki. Czy to prawda, ale tylko ten ostatni robi całe usunięcie w ramach tej samej transakcji? –

Powiązane problemy