IndexedDB API
IndexedDB は、ファイルや blob を含む大量の構造化データをクライアント側で保存するための低レベル API です。この API はインデックスを使用して、高パフォーマンスなデータの検索を行うことができます。Web Storage は比較的少量のデータを保存するのに有用ではありますが、構造化された非常に多くのデータを扱うには不十分です。IndexedDB が解決策を提供します。ここでは、完全な API リファレンスと使用ガイド、ブラウザーの対応の詳細、および重要な概念の説明へのリンクを提供します。
注: この機能は Web Worker 内で利用可能です
メモ: IndexedDB API は強力ですが、シンプルな用途にはとても複雑に見えるかもしれません。シンプルな API が好ましいのであれば、関連情報の節にある IndexedDB をプログラマーにとって扱いやすくするライブラリーを試してみてください。
主要概念と使用法
IndexedDB は SQL ベースの RDBMS に似たトランザクショナルデータベースシステムです。しかし、SQL ベース の RDBMS が固定された列を持つテーブルを使用するのに対して、IndexedDB は JavaScript ベースのオブジェクト指向データベースです。IndexedDB では、キーでインデックス付けされたオブジェクトを保存および取り出すことができます。構造化クローンアルゴリズムに対応した、任意のオブジェクトを保存することができます。データベースのスキーマを定義し、データベースへの接続を確立し、そして一連のトランザクションでデータの取り出しや更新を行う必要があります。
- IndexedDB の主な特徴と基本用語についてはこちらをご覧ください。
- IndexedDB の使用のガイドで、で、非同期的に IndexedDB を使用する方法を基本原理から学びます。
- データをオフラインで保存するための IndexedDB と、資産をオフラインで保存するためのサービスワーカーを組み合わせる方法は、 サービスワーカーにより PWA をオフラインで動作させるで概説しています。
メモ: たいていのウェブストレージ技術と同様に、IndexedDB も同一オリジンポリシーに従います。よって、保存済みデータは同一ドメイン内からアクセスできますが、異なるドメインにまたがってデータへアクセスすることはできません。
同期と非同期
IndexedDB を扱う操作は非同期に実行しますので、他のアプリケーションを妨げません。 IndexedDB は元々同期 API と非同期 API の両方を提供していました。同期 API はウェブワーカー内でのみの使用を意図していましたが、必要性に疑問があったため仕様から削除されました。ただし、同期 API はウェブ開発者から十分な要望がある場合は、将来再び導入される可能性があります。
ストレージの上限と破棄基準
クライアント側 (すなわちローカルディスク) に何らかのデータを保存するウェブ技術はいくつかあります。IndexedDB はそのような技術としてもっともよく語られます。ブラウザーがどれだけの容量をウェブデータストレージに割り当てるかや、容量の上限に達したときにどのデータを削除するかのプロセスは単純ではなく、またブラウザーにより異なります。ブラウザーのストレージ制限と削除基準で、少なくとも Firefox ではどのようにしているかの解説を試みています。
インターフェイス
データベースへのアクセスを行いたい場合は、window オブジェクトの indexedDB
属性上で open()
を呼び出してください。このメソッドは IDBRequest
オブジェクトを返します。IDBRequest
オブジェクト上で発行されたイベントによってアプリケーションが呼び出されることにより、非同期操作が行われます。
データベースへの接続
IDBEnvironment
- IndexedDB 機能へのアクセスを提供します。
window
およびworker
オブジェクトによって実装されています。このインターフェイスは 2.0 仕様の一部ではありません。 IDBFactory
- データベースへのアクセスを提供します。
indexedDB
グローバルオブジェクトによって実装されており、従って 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) Non-Standard- データベースから一定の範囲のデータを取り出すために使用可能な、インデックス用に指定したロケール (createIndex() の optionalParameters (en-US) をご覧ください) の規則によって並べ替えたキーの範囲を定義します。
カスタムイベントインターフェイス
本仕様では、以下のカスタムインターフェイスでイベントが発生します。
IDBVersionChangeEvent
(en-US)IDBVersionChangeEvent
インターフェイスは、IDBOpenDBRequest.onupgradeneeded
(en-US) イベントハンドラー関数によってデータベースのバージョンが変更されたことを表します。
廃止インターフェイス
仕様の早期段階では、以下のようなインターフェイスを定義していましたが、既に削除されています。以前書かれたコードを更新する必要がある場合のために、ドキュメントを残しています。
IDBDatabaseException
Deprecated- データベース操作が実行されている間に発生した例外状況を表します。
IDBTransactionSync
Deprecated- 同期版の
IDBTransaction
です。 IDBObjectStoreSync
Deprecated- 同期版の
IDBObjectStore
(en-US) です。 IDBIndexSync
Deprecated- 同期版の
IDBIndex
(en-US) です。 IDBFactorySync
Deprecated- 同期版の
IDBFactory
です。 IDBEnvironmentSync
Deprecated- 同期版の
IDBEnvironment
です。 IDBDatabaseSync
Deprecated- 同期版の
IDBDatabase
です。 IDBCursorSync
Deprecated- 同期版の
IDBCursor
です。
例
- eLibri: Marco Castelluccio が作成した、高度なライブラリおよび電子書籍リーダーアプリケーションです。IndexedDB Mozilla DevDerby の最優秀作品です。
- To-do Notifications (ライブデモ): リファレンスドキュメントで例示している、参考アプリケーションです。
- Storing images and files in IndexedDB
仕様書
関連情報
- localForage: クライアント側のデータストレージ向けに、シンプルな name:value 形式の構文を提供するポリフィルです。バックグラウンドで 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 を使っています。
- idb: IndexedDB API をほぼ反映した小さな (~1.15k) ライブラリーですが、使いやすさを大きく変える小さな改良が加えられています。
- idb-keyval: IndexedDB で実装された超シンプルで小さな (~600B) プロミスベースのキーバリューストア
- sifrr-storage: クライアントサイドのキーバリューストレージ用の小さな (~2kB) プロミスベースのライブラリーです。IndexedDB、localStorage、WebSQL、Cookie で動作します。優先度に基づいて、対応しているストレージを自動的に使用できます。
- lovefield: Lovefield は、ウェブアプリケーション用のリレーショナルデータベースです。 JavaScript で書かれており、クロスブラウザーで動作します。SQL ライクな API を提供しており、高速で安全、かつ簡単に使用できます。
- $mol_db: 小さな (~1.3kB) TypeScript のファサードで、プロミスベースの API と自動マイグレーションを備えています。