2

私は頭をIndexedDBに巻き込もうとしています。

キー パスのないキージェネレーターを使用するオブジェクト ストアを作成しました。

var objectStore = db.createObjectStore("domains", {autoIncrement: true });
objectStore.createIndex("domain", "domain", { unique: true, multiEntry: true });

レコードにアクセスするために、オブジェクト ストアを参照するインデックスを作成しました。インデックスのキー パスは、domain私のレコードのプロパティです。

以下は、私のオブジェクト ストア内の 1 つのレコードがどのように見えるかの例です。

{ domain: ["stackexchange",
           "stackoverflow",
           "superuser",
           "askubuntu",
           "serverfault"], 

  bold          : ["<strong>",1], 
  italic        : ["<em>",1],
  strikethrough : ["<del>",1],
  superscript   : ["<sup>",1],
  subscript     : ["<sub>",1],
  heading1      : ["<h1>",1],
  heading2      : ["<h2>",1],
  heading3      : ["<h3>",1],
  blockquote    : ["<blockquote>",1],
  code          : ["<code>",1],
  newline       : ["<br>",2],
  horizontal    : ["<hr>",2]
},

プロパティに表示される各エントリdomainは、オブジェクト ストアのすべてのレコードのすべてのドメイン キーの値の和集合で構成されるセットの中で一意であることが保証されています。IE これらのドメインは、私のオブジェクト ストアのどこにもありません。

ユーザーがオブジェクト ストア内のオブジェクトを編集できるようにする必要があります。ドメインが 1 つあれば、関連付けられたオブジェクトを次のように取得できます。

var DBOpenRequest= window.indexedDB.open(db_name, db_version);
DBOpenRequest.onsuccess= function(event){   
    var db= DBOpenRequest.result;
    var domains=db.transaction('domains', 'readwrite').objectStore('domains');

    var query = domains.index("domain").get("stackoverflow");   
};

さて、ここが私が混乱している部分です。ユーザーが編集したいプロパティを変更したり、新しいプロパティを追加したりしたら、上記で取得したオブジェクトをユーザーが作成した新しいオブジェクトに置き換えて、変更を保存する必要があります。(または、元のオブジェクトを変更して変更を保存します)。

私はこれを行うために使用IDBObjectStore.put()する必要があると思います。

このput()メソッドは 2 つのパラメーターを受け取ります。1 つは必須で、もう 1 つはオプションです。

value
    The value to be stored.
key
    The key to use to identify the record. If unspecified, it results to null.

2 番目のパラメーターは、インライン キーを使用しているインスタンスではおそらくオプションです。キージェネレーターで生成されたアウトオブラインキーを使用しています。

インデックスを介して取得したオブジェクトの (自動生成された、行外の) キーを取得する方法1?

これについて私が行くべき別の方法はありますか?

4

2 に答える 2

1

以下は、インデックスの IndexedDB 仕様のテキストです。

各インデックスには、一意のフラグもあります。このフラグが true に設定されている場合、インデックスは、インデックス内の 2 つのレコードが同じキーを持たないように強制します。インデックスの参照オブジェクト ストア内のレコードを挿入または変更しようとして、レコードの新しい値でインデックスのキー パスを評価すると、インデックス内に既に存在する結果が得られる場合、オブジェクト ストアへの変更の試行は失敗します

そのため、そのプロパティに一意のインデックスが作成されている場合、「put()」は使用できません。そのため、代わりに主キーを作成できます。つまり、オブジェクト ストアの作成時にkeyPathを使用できます。

var objectStore = db.createObjectStore("domains", {keyPath: "domain"});

以下の 2 つの URL を確認してください。一意のインデックスが存在する場合、更新を実行できないことを理解するのに役立ちます。

于 2015-06-01T15:07:22.303 に答える