首页 > 解决方案 > 我应该对 IndexedDB 使用 cursor.delete() 还是 objectStore.delete(id)?

问题描述

如果我想删除 IndexedDB 中的所有红色汽车,哪种方法更快?

transaction.objectStore("cars").index("color").openCursor("red").onsuccess = e => {
  var row = e.target.result;
  if(row) {
    row.delete();
    row.continue();
  }
};

这种删除光标行的方法是直接的,但它需要使用openCursor(而不是openKeyCursor),不幸的是它会解析整个对象。

或者

var cars = transaction.objectStore("cars");
cars.index("color").openKeyCursor("red").onsuccess = e => {
  var row = e.target.result;
  if(row) {
    cars.delete(row.primaryKey);
  }
};

此方法不需要光标解析整个对象,但objectStore.delete()可能需要重新执行搜索。

标签: javascriptindexeddb

解决方案


cursor.delete()本质上是类似cursor.source.delete(). 这两种方法都涉及在当前事务上创建一个新请求。虽然 store 方法需要进行扫描才能找到它的值,而 cursor 方法不需要,但两者的性能配置文件大致相同。使用删除光标当前位置的值cursor.delete()主要是为了方便,而不是优化。


推荐阅读