如何在IndexedDB中向objectStore添加记录时如何指定密钥?

时间:2013-01-15 22:58:06

标签: indexeddb

尝试学习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,它包含值的字符串并单独提供密钥。是可以这样做还是我必须提供一个包含我的字符串数据的对象作为属性的一部分和另一个具有该键的属性?

1 个答案:

答案 0 :(得分:5)

您正在使用内联键。但是你的案例需要object store with out-of-line key

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

然后使用外部密钥add record,“1”。

var fooRequest = fooObjStore.add({data: "myData"}, "1");