6

IndexedDBの概念とAPIを学習しようとしていますが、IDBObjectStore.addメソッドを使用してobjectStoreのキーを指定する方法を理解しようと苦労しています。仕様によると、最初のパラメーターは値であり、2番目のオプションのパラメーターはキーです。値のプロパティとしてBarを持つオブジェクト(オブジェクト)を指定するとレコードを追加できますが、2番目のパラメーターを介してオブジェクトを介してキーを渡そうとすると、追加の試行が失敗し、詳細が表示されます私が得るものは次のとおりです。

コード: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 に答える