6

试图学习 IndexedDB 的概念和 API,我正在努力弄清楚如何使用 IDBObjectStore.add 方法为 objectStore 指定键。根据规范,第一个参数是值,第二个可选参数是键。当我提供一个具有 Bar 作为值的属性的对象(它是一个对象)时,我可以添加一条记录,但是当我尝试通过第二个参数通过对象传递键时,添加尝试失败并且详细信息我得到的是:

代码:5。消息:DataError:DOM IDBDatabase 异常 5。名称:DataError。堆栈:错误:提供的数据不符合要求。在 IDBOpenDBRequest.dbOpenRequest.onsucces

代码示例如下:

var dbOpenRequest = window.indexedDB.open("sandbox")

    dbOpenRequest.onupgradeneeded = function (event) {
        var db = dbOpenRequest.result;

        var fooObjStore = db.createObjectStore("Foo", {
            keyPath: "Bar",
            autoIncrement: false
        });
    }

    dbOpenRequest.onsuccess = function (event) {
        var db = dbOpenRequest.result;
        var transaction = db.transaction(["Foo"], "readwrite");
        transaction.oncomplete = function () {
            console.log("Transaction complete");
        }            

        transaction.onerror = function (event) {
            console.error("Transaction error! " + event.target.webkitErrorMessage);
        }

        var fooObjStore = transaction.objectStore("Foo");
        try {
            //Works
            var fooRequest = pipelineObjStore.add({ data: "myData", Bar: "1" });

            //Fails
            fooRequest = pipelineObjStore.add({ data: "myData" }, "2" );

            //Fails
            fooRequest = pipelineObjStore.add({ data: "myData" }, { Bar: "3" });
        }
        catch (e) {
            console.error("Code: " + e.code
                + ". \nMessage: " + e.message
                + ". \nName: " + e.name
                + ". \nStack: " + e.stack);
        }

        fooRequest.onsuccess = function (event) {
            console.log("Pipeline request successful");
        }

        fooRequest.onerror = function (event) {
            console.error("Pipeline request error. " + event.target.webkitErrorMessage);
        }
    }

    dbOpenRequest.onerror = function (event) {
        console("Error ");
    }

我最终想要做的是创建一个 objectStore,其中包含其值的字符串并单独提供密钥。是否可以这样做,或者我是否必须提供一个对象,该对象包含我的字符串数据作为属性的一部分和另一个具有键的属性?

4

1 回答 1

8

您正在使用内联键。但是您的情况需要带有 out-of-line key 的对象存储

var fooObjStore = db.createObjectStore("Foo", {
  autoIncrement: false 
});

然后你用你的外部键添加记录,这里是“1”。

var fooRequest = fooObjStore.add({data: "myData"}, "1");
于 2013-01-16T00:19:53.657 回答