IDBIndex: getKey() メソッド

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since September 2021.

IDBIndex インターフェイスの getKey() メソッドは、IDBRequest オブジェクトを返し、別スレッドでこのインデックス内の与えられたキーに対応する主キー、もしくは keyIDBKeyRange に設定された場合は対応する最初の主キーを検索します。

主キーが見つかった場合は、これを要求オブジェクトの result に設定します。IDBIndex.get と違ってレコード全体は返さないことに注意してください。

メモ: この機能はウェブワーカー内で利用可能です。

構文

js
getKey()
getKey(key)

引数

key 省略可

取得するレコードを特定するキーまたは IDBKeyRange です。この値が null または省略された場合は、ブラウザーは無限のキー範囲を使用します。

返値

この操作に関係する今後のイベントが発火する IDBRequest オブジェクトです。

操作に成功した場合は、この要求の result プロパティの値は与えられたキーもしくはキー範囲にマッチする最初のレコードのキーになります。

例外

このメソッドは、以下の種類のいずれかの DOMException を投げる可能性があります。

TransactionInactiveError DOMException

この IDBIndex のトランザクションが実行中でないとき投げられます。

DataError DOMException

与えられたキーまたはキー範囲が無効なキーを含むとき投げられます。

InvalidStateError DOMException

この IDBIndex が削除されたか取り除かれたとき投げられます。

以下の例では、トランザクションとオブジェクトストアを開き、シンプルな連絡先データベースからインデックス lName を取得します。そして、このインデックスで IDBIndex.openCursor により基本的なカーソルを開きます。これは、返されるレコードが主キーではなくこのインデックスに基づいてソートされる以外、ObjectStore で直接 IDBObjectStore.openCursor を用いてカーソルを開くのと同じように動きます。

そして、myIndex.getKey('Bungle') を用いて lNameBungle であるレコードの主キーを取得し、success コールバックで要求の結果をコンソールに記録します。

最後に、各レコードを走査し、データを HTML テーブルに挿入します。動く例全体は、IndexedDB-examples デモレポジトリーを参照してください。(動く例を見る)

js
function displayDataByIndex() {
  tableEntry.innerHTML = "";
  const transaction = db.transaction(["contactsList"], "readonly");
  const objectStore = transaction.objectStore("contactsList");

  const myIndex = objectStore.index("lName");
  const getKeyRequest = myIndex.getKey("Bungle");
  getKeyRequest.onsuccess = () => {
    console.log(getKeyRequest.result);
  };

  myIndex.openCursor().onsuccess = (event) => {
    const cursor = event.target.result;
    if (cursor) {
      const tableRow = document.createElement("tr");
      tableRow.innerHTML =
        `<td>${cursor.value.id}</td>` +
        `<td>${cursor.value.lName}</td>` +
        `<td>${cursor.value.fName}</td>` +
        `<td>${cursor.value.jTitle}</td>` +
        `<td>${cursor.value.company}</td>` +
        `<td>${cursor.value.eMail}</td>` +
        `<td>${cursor.value.phone}</td>` +
        `<td>${cursor.value.age}</td>`;
      tableEntry.appendChild(tableRow);

      cursor.continue();
    } else {
      console.log("全エントリーを表示しました。");
    }
  };
}

仕様書

Specification
Indexed Database API 3.0
# ref-for-dom-idbindex-getkey①

ブラウザーの互換性

BCD tables only load in the browser

関連情報