IDBIndex
IndexedDB API の IDBIndex
インターフェイスは、データベース内のインデックスへの非同期アクセスを提供します。インデックスはオブジェクトストアの一種で、参照先オブジェクトストアと呼ばれる別のオブジェクトストア内のレコードを検索するためのものです。データを取り出すためにこのインターフェイスを使用します。
オブジェクトストア内のレコードは、主キーを使用して取り出すことも、インデックスを使用して取り出すこともできます。インデックスにより、オブジェクトストア内のレコードに格納されている主キー以外の値の性質を用いてオブジェクトストアからレコードを検索できるようになります。
インデックスは永続的なキー-値ストレージで、そのレコードの値の部分は参照先オブジェクトストア内のレコードのキーの部分になります。参照先オブジェクトストアでレコードが挿入・更新・削除されると、そのたびにインデックス内でもレコードが自動で作成されます。あるインデックス内のレコードはそれぞれ参照先オブジェクトストア内のレコード 1 個だけを指すことができますが、複数のインデックスが同じオブジェクトストアを参照することができます。オブジェクトストアが変更されると、そのオブジェクトストアを参照する全てのインデックスが自動で更新されます。
ある範囲に含まれるキーの集合を得ることができます。詳しくは、IDBKeyRange
を参照してください。
メモ: この機能はウェブワーカー内で利用可能です。
インスタンスプロパティ
IDBIndex.isAutoLocale
読取専用 非標準 Experimental-
インデックスの作成時に
locale
の値がauto
に設定されたかを表すboolean
値を返します。(createIndex()
の引数options
を参照してください) IDBIndex.locale
読取専用 非標準 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 レポジトリを参照してください。(動く例を見る)
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
関連情報
- IndexedDB の使用
- トランザクションの開始:
IDBDatabase
- トランザクションの使用:
IDBTransaction
- キーの範囲の設定:
IDBKeyRange
- データの取得と変更:
IDBObjectStore
- カーソルの使用:
IDBCursor
- リファレンス例: To-do Notifications (動く例を見る)