Подтвердить что ты не робот

Удаление нескольких записей в IndexedDB на основе индекса

Я использую IndexedDB, и у меня есть два хранилища объектов: equip (представляет другое оборудование, первичный ключ tagNo) и equipParts (представляет части части оборудования и имеет индекс, который основан на номере тега/серийном номере, первичный ключ seqNo, с полем tagNo, который представляет оборудование, часть которого является частью).

Если я удалю запись в оборудовании, я хочу удалить все записи в equipParts с тегом NoO equip (точно так же, как 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 на основе не уникального индекса (который может быть основным ключом хранилища родительских объектов)?

4b9b3361

Ответ 1

Вы должны получить первичные ключи для удаления записей.

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;
  }
}

Ответ 2

Я нашел самый простой подход с этим

index.iterateCursor(IDBKeyRange, (cursor) => {
  if(cursor){
    cursor.delete();
    cursor.continue();
  }
});

таким образом, если у вас есть асинхронная функция, вы можете просто использовать

await index.iterateCursor...

и жди обещания с другой стороны