IE10 と Metro スタイル アプリにおける IndexedDB の更新
Internet Explorer チームは、幅広い Web コミュニティとの連携をとおして IndexedDB 仕様の改良に取り組み続けています。IndexedDB は、インターネットに接続されていない場合でもユーザーのデバイス上でデータを保存、検索、取得できるようにするための W3C 草案 (英語) です。Windows 8 Consumer Preview の IE10 と Metro スタイル アプリは Web プラットフォームの機能として IndexedDB を利用しています。
このブログ記事では、最新版の W3C 仕様を実装するために Internet Explorer 10 Consumer Preview に適用された変更点について説明します。
バージョン管理に対する変更点
最も重要な変更点の 1 つが、開発者によるバージョン間のデータベース スキーマ (オブジェクト ストア、インデックス) の更新方法です。ワーキング グループ (マイクロソフトも参加) は、IDBDatabase.setVersion
API を新しい IDBFactory.open
API に置き換えることを決定しました。新しい open
API では、追加のパラメーターを使用して、現在のデータベース バージョンを使用するか、データベース スキーマを新しいバージョンに更新するかを検出します。この open
API が IDBOpenDBRequest
オブジェクトを返すことで、onupgradeneeded イベントを登録できるようになります。イベント ハンドラー内で追加のオブジェクト ストアとインデックスを追加することで、データベース スキーマを更新できます。
既存のコードを更新するには、open
メソッドに version
パラメーターを追加して setVersion
への呼び出しを置き換え、新しい onupgradeneeded
イベント ハンドラーを IDBOpenDBRequest
に登録します (下記参照)。
以前のコードの例 (緑色のハイライトが影響を受けるコード)
function openDBTest(dbName) {
var rq = window.msIndexedDB.open(dbName);
rq.onsuccess = successOpenningDB;
rq.onerror = failureHandler;
}
function successOpenningDB(evt) {
var db = evt.target.result;
var rq = db.setVersion("1");
rq.onsuccess = successHandler;
rq.onerror = failureHandler;
}
function successHandler(evt) {
//create schema
}
新しいコードの例 (黄色のハイライトが変更されたコード)
function openDBTest(dbName) {
var rq = window.msIndexedDB.open(dbName, 1);
rq.onsuccess = useDB;
rq.onupgradeneeded = successHandler;
rq.onerror = failureHandler;
}
function successHandler(evt) {
//create schema
}
その他の変更点
その他、プラットフォームに適用された小規模な変更点 (重要であることには変わりません) をいくつか紹介します。
IDBCursor.advance(count)
(英語) メソッドが追加されました。カーソル内のレコードをスキップできるようにするこのメソッドによって、改ページ シナリオに対応できるようになりました。データにアクセスする前にスキップするレコードの数はcount
パラメーターで定義します。有効な値は 1 以上です。IDBObjectStore.count(key)
(英語) およびIDBIndex.count(key)
(英語) メソッドが追加されました。これらによって、特定の基準に一致するレコードをカウントできるようになります。キー値が指定されていない場合は、インデックスまたはオブジェクト ストア内のすべてのレコードの数が返されます。IDBFactory.cmp(first, second)
(英語) メソッドが追加されました。このメソッドは、2 つのキー値を比較して、いずれかの値が一方より大きいか、または両方の値が等しいかを判定します。IDBKeyRanges
が、IDBObjectStore.count
、IDBObjectStore.delete
、IDBIndex.count
などの追加のメソッドと連携するようになりました。これによって、キー値のグループにまたがるレコードに一致させることができます。必要なデータベースに追加される値が、以前に定義されたすべてのインデックスを満たす必要がなくなりました。これによって、以前に定義されたインデックスの範囲に含まれない
IDBObjectStore
にレコードを追加することができます。アクティブなトランザクションのコンテキストで例外がスローされると、トランザクションが中止されるようになりました。これは、たとえば任意の要求の
onsuccess
イベント ハンドラー内で例外がスローされると、アクティブなトランザクションが中止されることを意味します。ただし例外処理を実行すれば、データベース トランザクションを通常どおり続行できます。// This won’t abort the transaction because there is no active transaction.
function createTransaction() {
var txn = db.transaction("test");
window.aaaaaa();
}
// This will abort the transaction because the exception is thrown when there is an active transaction.
var rq = objectStore.add(record);
rq.onsuccess = function (event) {
window.aaaaaa();
}
BLOB に対するインデックス プロパティのサポートが追加されました。これによって、バイナリ データを Web からダウンロードし、ローカルに保存して、BLOB のプロパティ (名前、サイズなど) を BLOB に対するインデックスまたは一意キーとして使用することができます。この機能を使うと、音楽ファイル コレクションをオフライン再生したり、画像やビデオをオフライン表示しながら、BLOB の名前でコレクションを検索するというシナリオが可能になります。IE Test Drive で公開している最新のデモでは、この機能を使って Facebook のアルバムをオフラインで表示 (英語) しています。
IE Test Drive デモ "Facebook Companion (英語)"
さらに私たちは、新しいテストや既存テストの更新を含め、IndexedDB に関する 100 件以上のテスト ケース (英語) を W3C ワーキング グループに提出しています。
サイトやアプリにおける IndexedDB の使用方法を制御する
Windows 8 Consumer Preview では、W3C 仕様の変更に対応した更新に加えて、デバイス上でのサイトとアプリによる IndexedDB の使用方法をユーザーが制御するための改良がいくつか行われています。
- IndexedDB を使用する Metro スタイル アプリ用のアンインストール ハンドラーが導入されました。このハンドラーにより、エンド ユーザーがアプリケーションを削除する場合に、アプリの IndexedDB データベースに関連するデータがアンインストール プロセス中に必ず自動で削除されるようになります。
- サイトがディスク容量を使いすぎないようにするためのクォータ (記憶域の制限) が実装されました。クォータ制限は、IT 管理者によるグループ ポリシー設定か、管理用のアクセス権を持つユーザーのレジストリ操作により更新できます。ただしクォータは Metro スタイル アプリには適用されません。
- エンド ユーザーによるデータベース管理とクォータ管理用の新しいブラウザー インターフェイスが追加されました。ユーザーは [Caches and databases] (キャッシュおよびデータベース) ダイアログを使用してデータベースを個別に削除できます。あるいは [Delete Browsing History] (閲覧の履歴の削除) ダイアログの [Cookies and Web site data] (Cookie および Web サイト データ) チェック ボックスを使用してすべてのデータベースを削除することも可能です。
[Website Data Settings] (Web サイト データ設定) ダイアログの新しい [Caches and databases] (キャッシュおよびデータベース) タブと、更新された [Delete Browsing History] (閲覧の履歴の削除) ダイアログのスクリーン ショット
今後を見据えて
W3C の WebApp ワーキング グループ (英語) では、仕様に対する重要な改良点を実装し、変更すべき点についてはその数と領域を減らしていくことで、IndexedDB の完成に現在も取り組み続けています。これは、こうしたテクノロジを Web 開発者が活用できるようになる近い将来に向けた重要なステップであり、その将来とは Windows 8 と IE10 のことでもあります。
IndexedDB を活用したサイトやアプリの登場を楽しみにしています。IE10 における IndexedDB のフィードバックもお待ちしています。
—Internet Explorer 担当グループ主任プログラム マネージャー (博士) Israel Hilerio