IndexedDB API

IndexedDB は、ファイルや blob を含む大量の構造化データをクライアント側で保存するための低レベル API です。この API はインデックスを使用して、高パフォーマンスなデータの検索を行うことができます。ウェブストレージは比較的少量のデータを保存するのに有用ではありますが、構造化された非常に多くのデータを扱うには不十分です。IndexedDB が解決策を提供します。ここでは、完全な API リファレンスと使用ガイド、ブラウザーの対応の詳細、および重要な概念の説明へのリンクを提供します。

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

メモ: IndexedDB API は強力ですが、シンプルな用途にはとても複雑に見えるかもしれません。シンプルな API が好ましいのであれば、関連情報の節にある IndexedDB をプログラマーにとって扱いやすくするライブラリーを試してみてください。

主要概念と使用法

IndexedDB は SQL ベースの RDBMS に似たトランザクショナルデータベースシステムです。しかし、SQL ベース の RDBMS が固定された列を持つテーブルを使用するのに対して、IndexedDB は JavaScript ベースのオブジェクト指向データベースです。IndexedDB では、キーでインデックス付けされたオブジェクトを保存および取り出すことができます。構造化複製アルゴリズムに対応した、任意のオブジェクトを保存することができます。データベースのスキーマを定義し、データベースへの接続を確立し、そして一連のトランザクションでデータの取り出しや更新を行う必要があります。

メモ: たいていのウェブストレージ技術と同様に、IndexedDB も同一オリジンポリシーに従います。よって、保存済みデータは同一ドメイン内からアクセスできますが、異なるドメインにまたがってデータへアクセスすることはできません。

同期と非同期

IndexedDB を扱う操作は非同期に実行しますので、他のアプリケーションを妨げません。

ストレージの上限と破棄基準

クライアント側 (すなわちローカルディスク) に何らかのデータを保存するウェブ技術はいくつかあります。IndexedDB はそのような技術としてもっともよく語られます。ブラウザーがどれだけの容量をウェブデータストレージに割り当てるかや、容量の上限に達したときにどのデータを削除するかのプロセスは単純ではなく、またブラウザーにより異なります。ブラウザーのストレージ制限と削除基準で、少なくとも Firefox ではどのようにしているかの解説を試みています。

インターフェイス

データベースへのアクセスを行いたい場合は、 open()window オブジェクトの indexedDB 属性上で呼び出してください。このメソッドは IDBRequest オブジェクトを返します。IDBRequest オブジェクト上で発行されたイベントによってアプリケーションが呼び出されることにより、非同期操作が行われます。

データベースへの接続

IDBFactory

データベースへのアクセスを提供します。indexedDB グローバルオブジェクトによって実装されており、従って API へのエントリーポイントになります。

IDBOpenDBRequest

データベースを開くリクエストを表します。

IDBDatabase

データベース接続を表します。データベースとのトランザクション処理を行う唯一の方法です。

データの取り出しと変更

IDBTransaction

トランザクションを表します。(アクセスしたいオブジェクトストアの) スコープを指定し、(読み取り専用または読み書き可能といった) アクセスの種類を定義して、データベースへのトランザクションを作成します。

IDBRequest

データベースへのリクエストの処理、および結果へのアクセスを提供する汎用インターフェイスです。

IDBObjectStore

IndexedDB 内のデータセットにアクセスできるオブジェクトストアを表し、主キーを使用して探索します。

IDBIndex

こちらも IndexedDB データベース内のデータのサブセットにアクセスできますが、レコードの探索に主キーではなくインデックスを使用します。IDBObjectStore より高速に動作する場合があります。

IDBCursor

オブジェクトストアとインデックスを反復処理します。

IDBCursorWithValue

オブジェクトストアとインデックスを反復処理して、カーソルの現在の値を返します。

IDBKeyRange

データベースから一定の範囲のデータを取り出すために使用可能な、キーの範囲を定義します。

IDBLocaleAwareKeyRange Non-standard

データベースから一定の範囲のデータを取り出すために使用可能な、インデックス用に指定したロケール (createIndex() の引数 options をご覧ください) の規則によって並べ替えたキーの範囲を定義します。

カスタムイベントインターフェイス

本仕様では、以下のカスタムインターフェイスでイベントが発生します。

IDBVersionChangeEvent

IDBVersionChangeEvent インターフェイスは、IDBOpenDBRequest.onupgradeneeded イベントハンドラー関数によってデータベースのバージョンが変更されたことを表します。

仕様書

Specification
Indexed Database API 3.0

関連情報

  • localForage: クライアント側のデータストレージ向けに、シンプルな name:value 形式の構文を提供するポリフィルです。バックグラウンドで IndexedDB を使用しますが、IndexedDB に対応していないブラウザーでは Web SQL (非推奨)や localStorage にフォールバックします。
  • Dexie.js: 優良でシンプルな構文により高速なコード開発を可能にする、IndexedDB のラッパーです。
  • JsStore: SQL 風の構文による IndexedDB のラッパーです。
  • MiniMongo: クライアント側のインメモリーの mongodb で localstorage と server sync over http を元にしたもの。MiniMongo は MeteorJS で使われています。
  • PouchDB: クライアント側のブラウザー内の CouchDB 実装で IndexedDB を使っています。
  • idb: IndexedDB API をほぼ反映した小さな (~1.15k) ライブラリーですが、使いやすさを大きく変える小さな改良が加えられています。
  • idb-keyval: IndexedDB で実装された超シンプルで小さな (~600B) プロミスベースのキーバリューストア
  • $mol_db: 小さな (~1.3kB) TypeScript のファサードで、プロミスベースの API と自動マイグレーションを備えています。
  • RxDB IndexedDB の上に使用することができる NoSQL クライアントサイドデータベースです。インデックス、圧縮、レプリケーションに対応して います。また、 IndexedDB にクロスタブ機能やオブザーバー機能を追加しています。