0

我正在尝试实现这个例子

在我尝试删除某个项目之前,一切正常。

使用这个:

request.onupgradeneeded = function(event) {
      console.log("upgrade", event);

      db = event.target.result;
      console.log("db", db);

      if (!db.objectStoreNames.contains("chatBot")) {
        var objectStore = db.createObjectStore("chatBot", {keyPath: "timeStamp", autoIncrement: true});
      }
    };

并设置删除:

btnDelete.addEventListener("click", function() {
      var id, transaction, objectStore, request;

      id = document.getElementById("txtID").value;
      console.log("id", typeof id);

      transaction = db.transaction("people", "readwrite");
      objectStore = transaction.objectStore("people");
      request = objectStore.delete(id);
      request.onsuccess = function(evt) {
        console.log("deleted content");
      };
    }, false);

将项目添加到 indexedDB 没有问题,但由于某种原因,我无法弄清楚为什么它不能删除这些项目。

id是一个字符串,objectStore.delete(id)是正确的实现。

这是示例的pastebin

使用火狐 18

4

1 回答 1

4

由于您使用的是 autoIncrement 键,因此该键是由用户代理生成的。在 FF 和 Chrome 中,它是从 1 开始的整数。如果您提供有效密钥并将您的密钥转换id为整数,您的代码运行良好。我在 FF 和 Chrome (dartium) 中都进行了测试。'1'并且1根据 IndexedDB API 密钥定义是不同的密钥。

另一个问题 IndexedDB API 设计。删除方法总是返回成功事件处理程序,undefined结果是给定键是否被删除。所以调试起来非常困难。我认为它至少应该返回已删除记录的数量。

[编辑] mod 代码: http: //pastebin.com/mLpU0VfP
[编辑...也]注意+stringinteger
request = db.transaction("people", "readwrite").objectStore("people").delete(+id);

于 2013-01-15T03:39:58.653 回答