Web SQL DatabaseとIndexed Database API
HTML5では、API群が整備され、データベース関係のAPIも充実します。これによって、これまでよりも柔軟なWebアプリケーションを作れるようになるでしょう。今回は、それらのAPIの中から、「Web SQL Database」と「Indexed Database API」の2つを取り上げます。
Web SQL Databaseの概要
第4回では、Web Storageを紹介しました。Web Storageは、シンプルなデータベースAPIで、Cookieの代わりとして使うなどの使い道があります。ただし、単純なキー・バリュー型のデータベースなので、検索などの複雑な処理には向いていません。Webアプリケーションの中で本格的なデータベース処理を行うには、Web Storageでは機能的に不十分です。
そこで、「Web SQL Database」と呼ぶデータベースAPIが提案されています。Web SQL Databaseは、「SQL」と名前に入っていることから分かるように、リレーショナル・データベースを扱えるAPIです。データベースの各種の操作をSQLで記述できるので、かなり複雑な検索が可能であり、Webアプリケーションのさまざまなデータを保存するのに適しています。
ただし、リレーショナル・データベースの世界では、製品ごとに、SQLに細かな文法の違いがあり、互換性を保ちきれない面があります。同様のことがWeb SQL Databaseでも起こることが予想されるため、Webブラウザ・ベンダーによってWeb SQL Databaseに対する温度差があります。ちなみに、現在のWebブラウザでは、Safari 5/Google Chrome 7β/Opera 10.62はWeb SQL Databaseに対応していますが、Internet Explorer 9βとFirefox 4βは対応していません。
このようなことから、本記事の執筆時点では、仕様策定が停滞しています。W3CのWeb SQL Databaseの仕様を見ると、「This specification has reached an impasse」(この仕様は袋小路に入った)といった記述があります。
本記事では、Web SQL Databaseも取り上げますが、最終的には正式採用に至らなくなる可能性もあり得ますので、その点はご容赦ください。
Web SQL Databaseでの基本的な処理の流れ
Web SQL Databaseでデータベースを操作するには、データベースを開いた後、トランザクション(一連のSQL)を実行する、という流れを取ります。
データベースを開くには、「openDatabase」という関数を使います。書き方は以下の通りです。各パラメータの意味は表1の通りです。また、戻り値はデータベースを指すオブジェクトになります。そのオブジェクトは変数に代入しておいて、後でメソッドを実行する際に使います。
openDatabase(データベース名, バージョン, 表示名, 見込み容量)
表1: openDatabase関数のパラメータ
パラメータ名 | 内容 |
---|---|
データベース名 | データベースに付ける名前 |
バージョン | データベースのバージョン番号 このパラメータを指定した場合、データベースのバージョンがパラメータ値に合っていなければ、データベースを開くことができない このパラメータに空文字を指定すれば、バージョンに関係なくデータベースを開くことができる |
表示名 | ユーザーに見せるデータベースの名前 Webブラウザによってはデータベース管理機能があることもあり、その画面にはこの名前が表示されることがある |
見込み容量 | データベースにおおむね見込まれる容量(バイト単位) |
トランザクションを実行するには、データベースのオブジェクトの「transaction」というメソッドを使います。
データベース.transaction(コールバック, エラー時コールバック, 成功時コールバック)
「コールバック」には、データベースに対する各種の処理を行う関数を指定します。この関数には、パラメータとして、トランザクションを指すオブジェクトが渡されます。
一連のデータベース処理がすべて成功すると、「成功時コールバック」に指定した関数が実行されます。一方、データベース処理の途中で失敗があると、「エラー時コールバック」の関数が実行されます。この関数には、パラメータとしてエラー内容を指すオブジェクトが渡されます(表2)。
表2: エラー内容を表すオブジェクト
プロパティ | 内容 |
---|---|
code | エラー・コード |
message | エラー・メッセージ |
コールバックの中でSQLを実行するには、トランザクション・オブジェクトの「executeSql」というメソッドを実行します。
トランザクション.executeSql(SQL文, 値, 成功時コールバック, 失敗時コールバック)
パラメータの内容は、表3の通りです。
表3: executeSqlメソッドのパラメータ
パラメータ名 | 内容 |
---|---|
SQL文 | 実行するSQLの文 |
値 | SQL文に「?」でプレース・ホルダーを入れる場合に、そのプレース・ホルダーを置き換える値の配列 |
成功時コールバック | SQLの実行に成功した時に実行する関数 |
エラー時コールバック | SQLの実行に失敗した時に実行する関数 |
SQLの実行に成功すると、「成功時コールバック」で指定した関数が実行され、トランザクションのオブジェクトと、処理結果を表すオブジェクト(表4)が渡されます。
表4: 処理結果を表すオブジェクト
プロパティ | 内容 |
---|---|
insertId | レコードのID(INSERT命令を実行した場合) |
rowsAffected | 影響があったレコードの数(UPDATE/DELETE命令を実行した場合) |
rows | 読み込んだレコードの配列(SELECT命令を実行した場合) |