18

我正在使用 IndexedDB 并且我有两个对象存储:equip(代表不同的设备,主键tagNo)和equipParts(代表一件设备的部件,并且有一个基于标签号/序列号的索引,主键seqNo,带有一个字段tagNo,它表示该部分所属的设备)。

如果我删除了equip中的一条记录,我想删除所有带有equip的tagNoequipParts记录(就像“其中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();

问题是只删除了装备中的记录;设备零件中的记录保留在那里。有没有办法根据非唯一索引(可以是父对象存储的主键)删除 IndexedDB 对象存储中的多条记录?

4

3 回答 3

19

您必须获取主键才能删除记录。

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();
  }
}
于 2013-09-05T01:51:25.843 回答
2

我使用idb通过这种方式删除了属于索引的多条记录:

    var tx = idb.transaction("MyObjectStore", 'readwrite');
    var index = tx.store.index('my_relid_idx');
    var pdestroy = index.openCursor(RelID);
    pdestroy.then(async cursor => {
        while (cursor) {
            cursor.delete();
            cursor = await cursor.continue();
        }
    })
于 2021-03-02T10:01:47.250 回答
1

我发现了一个最简单的方法

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

这样,如果您将它放在异步功能下,则可以使用

await index.iterateCursor...

并等待对方的承诺

于 2019-10-16T22:18:33.233 回答