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)?
Dlaczego jest drugim nie wydajny? –
'openCursor' zwraca' IDBCursorWithValue', który wymaga odczytu wartości rekordu, natomiast pierwszy zwraca 'IDBCursor' bez wartości rekordu. –
Dzięki. Czy to prawda, ale tylko ten ostatni robi całe usunięcie w ramach tej samej transakcji? –