We're looking for a user researcher to understand the needs of developers and designers. Is this you or someone you know? Check out the post: https://mzl.la/2IGzdXS

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

註: この機能は Web Workers 内で利用可能です。

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

主要なコンセプトと使用法

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

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

同期と非同期

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

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

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

IndexedDB のインターフェイス

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

データベースへの接続

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

データの取り出しと変更

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

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

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

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

廃止インターフェイス

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

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

仕様

仕様書 策定状況 コメント
Indexed Database API 勧告 最初の定義
Indexed Database API 2.0 勧告    

ブラウザー実装状況

We're converting our compatibility data into a machine-readable JSON format. This compatibility table still uses the old format, because we haven't yet converted the data it contains. Find out how you can help!

機能 Chrome Edge Firefox (Gecko) Internet Explorer Opera Safari (WebKit)
基本サポート 23webkit
24 (unprefixed)
38 (prefixes deprecated)
57 (prefixes removed)
(有) 10.0 (10.0) moz
16.0 (16.0)
10 15

7.1, partial
10

Workers で使用可能 (有) (unprefixed)
38 (prefixes deprecated)
57 (prefixes removed)
(有) 37.0 (37.0)[1] (有) (有) 10
プライバシーモードで使用可能[3] (有) 未サポート 未サポート 未サポート 未サポート 未サポート
IDBLocaleAwareKeyRange 未サポート 未サポート 43.0 (43.0)[2] 未サポート 未サポート 未サポート
Indexed Database 2.0 58 ? ? ? 45 ?
機能 Android Webview Chrome for Android Edge Firefox Mobile (Gecko) Firefox OS IE/Edge Phone Opera Mobile Safari Mobile
基本サポート (有) (unprefixed)
38 (prefixes deprecated)
57 (prefixes removed)
(有) (unprefixed)
38 (prefixes deprecated)
57 (prefixes removed)
(有) 22.0 (22.0) 1.0.1 10 22 8, partial
10
Workers で使用可能 (有) (unprefixed)
38 (prefixes deprecated)
57 (prefixes removed)
(有) (unprefixed)
38 (prefixes deprecated)
57 (prefixes removed)
(有) 37.0 (37.0)[1] (有) (有) (有) 10
プライバシーモードで使用可能[3] 未サポート 未サポート 未サポート 未サポート 未サポート 未サポート ? ?
IDBLocaleAwareKeyRange 未サポート 未サポート 未サポート 43.0 (43.0)[2] 2.5[2] 未サポート 未サポート 未サポート
Indexed Database 2.0 58 58 ? ? ? ? 45 ?
  • [1] Gecko 42 (Firefox 42.0 / Thunderbird 42.0 / SeaMonkey 2.39) より前のバージョンでは、IDBCursorWithValue を Workers で使用できません。
  • [2] この機能はフラグによって隠されています。有効化して試行するには、about:config で dom.indexedDB.experimental を true に設定してください。
  • [3] "プライベートブラウジングモード" (Firefox) や "Incognito" (Chrome) とも呼ぶ。

関連情報

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

ドキュメントのタグと貢献者

このページの貢献者: Uemmra3, mottox2, yyss, hamasaki, YuichiNukiyama, ethertank, saneyuki_s, Potappo
最終更新者: Uemmra3,