2013-09-04 12 views
7

sto usando IndexedDB e ho due esercizi oggetto: dotare (indica apparecchiatura differente, chiave primaria tagNo) e equipParts (rappresenta le parti di un pezzo di materiale e ha un indice che si basa sul numero di tag/numero di serie, chiave primaria seqNo, con un campo tagNo che rappresenta l'apparecchiatura di cui fa parte la parte).Eliminazione di più record in IndexedDB basati su indice

Se elimino un record nella attrezzare, voglio eliminare tutti i record in equipParts porta il tagNo di dotare (proprio come "dove equipParts.tagNo = equip.tagNo").

estratto dal mio codice:

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

Il problema è che solo il record in dotare è soppressa; i record in equipParts rimangono lì. Esiste un modo per eliminare più record in un archivio oggetti IndexedDB basato su un indice non univoco (che può essere la chiave primaria dell'archivio oggetti padre)?

risposta

8

È necessario ottenere le chiavi primarie per eliminare i record.

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

In alternativa, ma non efficiente

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

Perché è la seconda non è efficiente? –

+1

'openCursor' return' IDBCursorWithValue', che richiede la lettura del valore del record, mentre il primo restituisce 'IDBCursor' senza valore di registrazione. –

+1

Grazie. È vero anche se solo l'ultimo fa l'intera eliminazione all'interno della stessa transazione? –

Problemi correlati