IDBIndex
========

IndexedDB API の `IDBIndex` インターフェイスは、データベース内のインデックスへの非同期アクセスを提供します。インデックスはオブジェクトストアの一種で、参照先オブジェクトストアと呼ばれる別のオブジェクトストア内のレコードを検索するためのものです。データを取り出すためにこのインターフェイスを使用します。

オブジェクトストア内のレコードは、主キーを使用して取り出すことも、インデックスを使用して取り出すこともできます。インデックスにより、オブジェクトストア内のレコードに格納されている主キー以外の値の性質を用いてオブジェクトストアからレコードを検索できるようになります。

インデックスは永続的なキー-値ストレージで、そのレコードの値の部分は参照先オブジェクトストア内のレコードのキーの部分になります。参照先オブジェクトストアでレコードが挿入・更新・削除されると、そのたびにインデックス内でもレコードが自動で作成されます。あるインデックス内のレコードはそれぞれ参照先オブジェクトストア内のレコード 1 個だけを指すことができますが、複数のインデックスが同じオブジェクトストアを参照することができます。オブジェクトストアが変更されると、そのオブジェクトストアを参照する全てのインデックスが自動で更新されます。

ある範囲に含まれるキーの集合を得ることができます。詳しくは、`IDBKeyRange` を参照してください。

**注:** この機能は Web Worker 内で利用可能です

インスタンスプロパティ
-----------

`IDBIndex.isAutoLocale` 読取専用  
Non-standard

Experimental

インデックスの作成時に `locale` の値が `auto` に設定されたかを表す `boolean` 値を返します。(`createIndex()` の引数 `options` を参照してください)

`IDBIndex.locale` 読取専用  
Non-standard

Experimental

作成時に `locale` の値が指定されていれば、インデックスのロケール (たとえば `en-US` や `pl`) を返します。(`createIndex()` の引数 `options` を参照してください)

`IDBIndex.name`

このインデックスの名前です。

`IDBIndex.objectStore` 読取専用 

このインデックスが参照するオブジェクトストアの名前です。

`IDBIndex.keyPath` 読取専用 

このインデックスのキーパスです。`null` である場合は、このインデックスは自動で作成されません。

`IDBIndex.multiEntry` 読取専用 

インデックスのキーパスを評価した結果が配列になったとき、インデックスがどのようにふるまうかを変更します。`true` の場合は、インデックスにキーの配列内の各アイテムに対応するレコードをそれぞれ作成します。`false` の場合は、配列であるキーに対応するレコード 1 個を作成します。

`IDBIndex.unique` 読取専用 

`true` の場合は、このインデックスはあるキーに対応する値の重複を許しません。

インスタンスメソッド
----------

EventTarget から継承します。

`IDBIndex.count()`

`IDBRequest` オブジェクトを返し、別のスレッドでキーの範囲に含まれるレコードの数を返します。

`IDBIndex.get()`

`IDBRequest` オブジェクトを返し、別のスレッドで参照先オブジェクトストア内の指定されたキーに対応する値、もしくは `key` が `IDBKeyRange` のときは対応する最初の値を検索します。

`IDBIndex.getKey()`

`IDBRequest` オブジェクトを返し、指定されたキーに対応する主キー、もしくは `key` が `IDBKeyRange` のときは対応する最初の主キーを別のスレッドで検索します。

`IDBIndex.getAll()`

`IDBRequest` オブジェクトを返し、指定されたキー、もしくは `key` が `IDBKeyRange` の場合はキーの範囲に対応する参照先オブジェクトストア内の全ての値を別のスレッドで検索します。

`IDBIndex.getAllKeys()`

`IDBRequest` オブジェクトを返し、指定されたキー、もしくは `key` が `IDBKeyRange` の場合はキーの範囲に対応する参照先オブジェクトストア内の全てのキーを別のスレッドで検索します。

`IDBIndex.openCursor()`

`IDBRequest` オブジェクトを返し、指定されたキーの範囲を走査するためのカーソルを別のスレッドで作成します。

`IDBIndex.openKeyCursor()`

`IDBRequest` オブジェクトを返し、指定されたキーの範囲をこのインデックスの順番で走査するためのカーソルを別のスレッドで作成します。

例
-

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

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


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

  const myIndex = objectStore.index("lName");
  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 # index-interface |

ブラウザーの互換性
---------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

関連情報
----

* IndexedDB の使用
* トランザクションの開始: `IDBDatabase`
* トランザクションの使用: `IDBTransaction`
* キーの範囲の設定: `IDBKeyRange`
* データの取得と変更: `IDBObjectStore`
* カーソルの使用: `IDBCursor`
* リファレンス例: To-do Notifications (動く例を見る)