IndexedDB API

IndexedDB は、ファイルや blob を含む構造化された多くのデータを保存する、クライアントサイドのローレベル API です。この API は高パフォーマンスなデータの検索を行うために、インデックスを使用します。Web Storage は比較的少量のデータを保存するのに有用ではありますが、構造化された非常に多くのデータを扱うには不十分です。IndexedDB が解決策を提供します。本ページは、MDN における IndexedDB のランディングページです。ここでは API リファレンスへのリンク、使用ガイド、ブラウザーのサポート状況、主要なコンセプトの説明を掲載します。

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

メモ: IndexedDB API は強力ですが、シンプルな用途にとってはとても複雑に見えるかもしれません。シンプルな API が好ましいのでしたら、IndexedDB をより開発者フレンドリーに扱える localForagedexie.jsZangoDBPouchDBJsStore などのライブラリを検討してください。

主要概念と使用法

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

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

同期と非同期

IndexedDB を扱う操作は非同期に実行しますので、他のアプリケーションを妨げません。 IndexedDB は元々同期 API と非同期 API の両方を提供していました。同期 API は Web Worker 内でのみの使用を意図していましたが、必要性に疑問があったため仕様から削除されました。ただし、同期 API はウェブ開発者から十分な要望がある場合は、将来再び導入される可能性があります。

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

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

インターフェイス

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

データベースへの接続

IDBEnvironment
IndexedDB 機能へのアクセスを提供します。window および worker オブジェクトによって実装されています。このインターフェイスは 2.0 仕様の一部ではありません。
IDBFactory
データベースへのアクセスを提供します。indexedDB (en-US) グローバルオブジェクトによって実装されており、従って API へのエントリーポイントになります。
IDBOpenDBRequest (en-US)
データベースを開くリクエストを表します。
IDBDatabase
データベース接続を表します。データベースとのトランザクション処理を行うためのみに使用されます。

データの取り出しと変更

IDBTransaction
トランザクションを表します。(アクセスしたいオブジェクトストアの) スコープを指定し、(読み取り専用または読み書き可能といった) アクセスの種類を定義して、データベースへのトランザクションを作成します。
IDBRequest
データベースへのリクエストの処理、および結果へのアクセスを提供する汎用インターフェイスです。
IDBObjectStore (en-US)
IndexedDB 内のデータセットにアクセスできるオブジェクトストアを表し、主キーを使用して探索します。
IDBIndex (en-US)
こちらも IndexedDB データベース内のデータのサブセットにアクセスできますが、レコードの探索に主キーではなくインデックスを使用します。IDBObjectStore (en-US) より高速に動作する場合があります。
IDBCursor
オブジェクトストアとインデックスをイテレートします。
IDBCursorWithValue (en-US)
オブジェクトストアとインデックスをイテレートして、カーソルの現在の値を返します。
IDBKeyRange (en-US)
データベースから一定の範囲のデータを取り出すために使用可能な、キーの範囲を定義します。
IDBLocaleAwareKeyRange (en-US) この API は標準化されていません。
データベースから一定の範囲のデータを取り出すために使用可能な、インデックス用に指定したロケール (createIndex() の optionalParameters (en-US) をご覧ください) の規則によって並べ替えたキーの範囲を定義します。

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

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

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

廃止インターフェイス

仕様の早期段階で定義されていたインターフェイスの一部が、現在、削除されています。以前書いたコードを最新の仕様に合わせて更新する際に必要になるであろうことから、削除されたインターフェイスに関するドキュメントは残してあります:

IDBVersionChangeRequest これは廃止された API であり、動作は保証されていません。
データベースのバージョンの変更リクエストを表現します。データベースのバージョンを変更する方法が (IDBDatabase.setVersion ではなく IDBFactory.open を呼び出すように) 変わりました。また削除された IDBVersionChangeRequest に代わり IDBOpenDBRequest (en-US) インターフェイスが用意されています。
IDBDatabaseException (en-US)  これは廃止された API であり、動作は保証されていません。
データベース操作が実行されている間に発生した例外状況を表します。
IDBTransactionSync (en-US) これは廃止された API であり、動作は保証されていません。
同期型の IDBTransaction です。
IDBObjectStoreSync (en-US) これは廃止された API であり、動作は保証されていません。
同期型の IDBObjectStore (en-US) です。
IDBIndexSync (en-US) これは廃止された API であり、動作は保証されていません。
同期型の IDBIndex (en-US) です。
IDBFactorySync (en-US) これは廃止された API であり、動作は保証されていません。
同期型の IDBFactory です。
IDBEnvironmentSync (en-US) これは廃止された API であり、動作は保証されていません。
同期型の IDBEnvironment です。
IDBDatabaseSync (en-US) これは廃止された API であり、動作は保証されていません。
同期型の IDBDatabase です。
IDBCursorSync (en-US) これは廃止された API であり、動作は保証されていません。
同期型の IDBCursor です。

仕様書

仕様書 状態 備考
Indexed Database API 2.0 勧告  
Indexed Database API 2.0 勧告 初回定義

関連情報

  • localForage: クライアントサイドのデータストレージ向けに、シンプルな name:value 形式の構文を提供する Polyfill です。バックグラウンドで IndexedDB を使用しますが、IndexedDB をサポートしないブラウザーでは WebSQL や localStorage にフォールバックします。
  • dexie.js: 優良でシンプルな構文により高速なコード開発を可能にする、IndexedDB のラッパーです。
  • ZangoDB: IndexedDB の MongoDB ライクなインターフェイスで、MongoDB でおなじみのフィルターリング、射影、ソート、アップデート、集計をサポートしています。
  • JsStore: SQL 風の構文による IndexedDB のラッパーです。
  • MiniMongo: クライアントサイドのインメモリーの mongodb で localstorage と server sync over http を元にしたもの。MiniMongo は MeteorJS で使われています。
  • PouchDB: クライアントサイドのブラウザー内の CouchDB 実装で IndexedDB を使っています。