我正在使用IndexedDB,我有两个对象存储: equip (代表不同的设备,主键 tagNo )和 equipParts (代表一件设备的一部分,并有一个索引,该索引基于标签号/序列号,主键 seqNo ,带有 tagNo 字段,表示该部件的设备部分)。
如果我删除装备中的记录,我想删除 equipParts 中带有装备的标签的所有记录(就像“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对象库中的多个记录?
答案 0 :(得分:14)
您必须获取主键才能删除记录。
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;
}
}
答案 1 :(得分:1)
我使用 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();
}
})
答案 2 :(得分:0)
我找到了最简单的方法
index.iterateCursor(IDBKeyRange, (cursor) => {
if(cursor){
cursor.delete();
cursor.continue();
}
});
这样,如果您在异步功能下拥有它,则只需使用
await index.iterateCursor...
并等待对方的承诺