ローカル SQL データベースについて

Adobe AIR 1.0 およびそれ以降

SQL データベースの使用に関する簡単な説明およびコード例については、Adobe Developer Connection で次のクイックスタートの記事を参照してください。

Adobe AIR には、ランタイム内で実行される SQL ベースのリレーショナルデータベースエンジンが含まれています。データベースのデータは、AIR アプリケーションが実行されているコンピューター上(コンピューターのハードディスク上など)のデータベースファイルにローカルで格納されます。データベースの実行やデータファイルの格納はローカルで行われるため、ネットワーク接続が利用可能かどうかに関係なく AIR アプリケーションでデータベースを使用できます。したがって、ランタイムのローカル SQL データベースエンジンは、永続的なローカルアプリケーションデータを格納するための便利なメカニズムとして利用できます。SQL やリレーショナルデータベースの使用経験がある場合には特に便利です。

ローカル SQL データベースの用途

AIR のローカル SQL データベース機能は、ユーザーのローカルコンピューターにアプリケーションデータを格納するあらゆる用途に使用できます。Adobe AIR には、データをローカルに格納するためのメカニズムが複数含まれており、それぞれに異なる利点があります。AIR アプリケーションでのローカル SQL データベースの用途としては、例えば次のようなものが考えられます。

  • データ指向アプリケーション(アドレス帳など)では、データベースを使用してメインアプリケーションデータを格納できます。

  • ユーザーがドキュメントを作成して保存したり共有したりするドキュメント指向アプリケーションでは、各ドキュメントをデータベースファイルとしてユーザーが指定した場所に保存できます(ただし、データベースが暗号化されていない限り、任意の AIR アプリケーションでデータベースファイルを開くことができます。潜在的に機密性の高いドキュメントについては、暗号化することをお勧めします)。

  • ネットワーク対応アプリケーションでは、アプリケーションデータのローカルキャッシュを格納したり、ネットワーク接続を利用できない場合にデータを一時的に格納したりするためにデータベースを使用できます。ローカルデータベースをネットワークデータストアと同期させるためのメカニズムを作成することもできます。

  • すべてのアプリケーションで、個々のユーザーのアプリケーション設定(ユーザーオプションなど)やアプリケーション情報(ウィンドウのサイズや位置など)を格納するためにデータベースを使用できます。

AIR データベースとデータベースファイルについて

個々の Adobe AIR ローカル SQL データベースは、コンピューターのファイルシステム内の 1 つのファイルとして格納されます。ランタイムには、データベースファイルの作成および構成や、データベースファイルのデータの操作および取得を管理する SQL データベースエンジンが含まれています。データベースのデータをファイルシステムのどこにどのように格納するかをランタイムが指定することはありません。各データベースはそれぞれがすべて 1 つのファイルに格納されます。データベースファイルをファイルシステムのどこに格納するかはユーザーが指定します。1 つの AIR アプリケーションで、独立した 1 つ以上のデータベース(データベースファイル)にアクセスできます。各データベースはファイルシステム上の 1 つのファイルとして格納されるため、アプリケーションの設計やオペレーティングシステムのファイルアクセスの制約によって必要とされる場所にデータベースを配置できます。各ユーザーが自分のデータのためにそれぞれ異なるデータベースファイルを使用することも、1 つのコンピューターのすべてのアプリケーションユーザーが 1 つのデータベースファイルにアクセスしてデータを共有することもできます。データは 1 つのコンピューターでローカルに格納されるため、別のコンピューターのユーザーとは自動的に共有されません。ローカル SQL データベースエンジンには、リモートデータベースやサーバーベースのデータベースに対して SQL ステートメントを実行する機能は用意されていません。

リレーショナルデータベースについて

リレーショナルデータベースは、データをコンピューターに格納(および取得)するためのメカニズムです。リレーショナルデータベースのデータはテーブルにまとめられます。テーブルの行はレコードまたは項目を表し、テーブルの列(「フィールド」とも呼ばれます)は各レコードを個別の値に分割します。例えば、アドレス帳アプリケーションに「友人」テーブルが含まれていた場合、テーブルの各行はデータベースに格納されている 1 人の友人を表し、テーブルの列は名前、姓、誕生日などのデータを表します。テーブルの各友人の行に対して、各列の値が個別に格納されます。

リレーショナルデータベースは、項目が別の種類の項目に関連付けられる複雑なデータを格納できるように作られています。リレーショナルデータベースでは、一対多の関係を持つ(1 つのレコードを別の種類の複数のレコードに関連付けることができる)データをすべて別のテーブルに分割する必要があります。例えば、アドレス帳アプリケーションで各友人について複数の電話番号を格納する場合、それは一対多の関係になります。この場合は、「友人」テーブルに各友人のすべての個人情報を格納し、別の「電話番号」テーブルにすべての友人のすべての電話番号を格納します。

各テーブルでは、友人や電話番号のデータを格納するほかに、この 2 つのテーブルの関係を追跡する(個々の友人のレコードをその電話番号に対応させる)ためのデータも必要になります。このデータを主キーと呼びます。主キーとは、テーブルの各行をそのテーブルの他の行から区別する一意の識別子です。主キーには、「自然キー」を使用することができます。自然キーとは、テーブルの各レコードを自然に区別するデータ項目です。「友人」テーブルに同じ誕生日を持つ友人が含まれていないことがわかっている場合は、誕生日の列を「友人」テーブルの主キー(自然キー)として使用できます。自然キーがない場合は、「友人 ID」などの主キー列を別途作成します。これは、アプリケーションで行を区別するために使用する人工的な値です。

主キーを使用して複数のテーブルの間に関係を設定することができます。例えば、各行(各友人)の一意の番号を含む「友人 ID」列が「友人」テーブルにある場合、「友人」テーブルに関連付けられる「電話番号」テーブルは、電話番号が属する友人の「友人 ID」を含む列と、実際の電話番号を含む列の、2 つの列で構成できます。これにより、どんなにたくさんの電話番号を持つ友人がいたとしても、すべての電話番号を「電話番号」テーブルに格納し、「友人 ID」の主キーを使用してその友人に関連付けることができます。あるテーブルの主キーが、関連テーブルでレコード間の関連を指定するために使用されている場合、その関連テーブルの値を外部キーと呼びます。AIR のローカルデータベースエンジンでは、多くのデータベースのように外部キー制約(挿入されたり更新されたりした外部キーの値に対応する行が主キーテーブルにあるかどうかを自動的に確認する制約)を作成することはできませんが、外部キー関係はリレーショナルデータベースの構造の重要な部分です。データベースのテーブルの間に関係を作成するときには外部キーを使用する必要があります。

SQL について

構造化照会言語(SQL)は、リレーショナルデータベースでデータを操作したり取得したりするために使用されます。SQL は、手続き型言語ではなく記述言語です。SQL ステートメントでは、データの取得方法をコンピューターに指示するのではなく、必要なデータのセットを記述します。データの取得方法はデータベースエンジンによって決定されます。

SQL 言語は、米国規格協会(ANSI)によって標準化されています。Adobe AIR のローカル SQL データベースは、SQL-92 標準のほとんどをサポートしています。

Adobe AIR でサポートされる SQL 言語について詳しくは、 ローカルデータベースでの SQL サポート を参照してください。

SQL データベースクラスについて

ActionScript 3.0 でローカル SQL データベースを操作するには、flash.data パッケージの以下のクラスのインスタンスを使用します。

クラス

説明

flash.data.SQLConnection

データベース(データベースファイル)を作成したり開いたりするための手段や、データベースレベルの操作を実行したりデータベーストランザクションを制御したりするためのメソッドを提供します。

flash.data.SQLStatement

データベースに対して実行される 1 つの SQL ステートメント(1 つのクエリまたはコマンド)を表します。ステートメントテキストの定義とパラメーター値の設定が含まれます。

flash.data.SQLResult

ステートメントの実行に関する情報や実行の結果( SELECT ステートメントの結果行、 UPDATE ステートメントや DELETE ステートメントの影響を受ける行の数など)を取得するための方法を提供します。

データベースの構造を記述するスキーマの情報を取得するには、flash.data パッケージの以下のクラスを使用します。

クラス

説明

flash.data.SQLSchemaResult

SQLConnection.loadSchema() メソッドの呼び出しによって生成されるデータベーススキーマの結果のコンテナとして機能します。

flash.data.SQLTableSchema

データベース内の 1 つのテーブルを記述する情報を提供します。

flash.data.SQLViewSchema

データベース内の 1 つのビューを記述する情報を提供します。

flash.data.SQLIndexSchema

データベース内のテーブルまたはビューの 1 つの列を記述する情報を提供します。

flash.data.SQLTriggerSchema

データベース内の 1 つのトリガーを記述する情報を提供します。

flash.data パッケージにはそのほか、SQLConnection クラスや SQLColumnSchema クラスで使用される定数を提供するクラスもあります。

クラス

説明

flash.data.SQLMode

SQLConnection.open() メソッドと SQLConnection.openAsync() メソッドの openMode パラメーターで使用できる値を表す一連の定数を定義します。

flash.data.SQLColumnNameStyle

SQLConnection.columnNameStyle プロパティで使用できる値を表す一連の定数を定義します。

flash.data.SQLTransactionLockType

SQLConnection.begin() メソッドのオプションパラメーターで使用できる値を表す一連の定数を定義します。

flash.data.SQLCollationType

SQLColumnSchema.defaultCollationType プロパティと SQLColumnSchema() コンストラクターの defaultCollationType パラメーターで使用できる値を表す一連の定数を定義します。

また、flash.events パッケージには、使用するイベント(およびサポート定数)を表す以下のクラスがあります。

クラス

説明

flash.events.SQLEvent

SQLConnection または SQLStatement のインスタンスで操作が正常に実行された場合に送出されるイベントを定義します。SQLEvent クラスには、各操作に関連付けられたイベント型定数が定義されています。

flash.events.SQLErrorEvent

SQLConnection または SQLStatement のインスタンスで操作がエラーになった場合に送出されるイベントを定義します。

flash.events.SQLUpdateEvent

INSERT UPDATE DELETE のいずれかの SQL ステートメントが実行された結果、接続先データベースのテーブルデータが変更された場合に、SQLConnection インスタンスで送出されるイベントを定義します。

さらに、flash.errors パッケージには、データベース操作のエラーに関する情報を提供する以下のクラスがあります。

クラス

説明

flash.errors.SQLError

データベース操作のエラーに関する情報(実行された操作や失敗の原因など)を提供します。

flash.errors.SQLErrorOperation

SQLError クラスの operation プロパティで使用できる値を表す一連の定数を定義します。このプロパティは、エラーになったデータベース操作を示します。

同期実行モードと非同期実行モードについて

ローカル SQL データベースを操作するためのコードを記述する際には、非同期実行モードまたは同期実行モードのどちらの実行モードでデータベース操作を実行するかを指定します。コード例では通常、各操作の実行方法が両方の方法で示されているため、ニーズに合う方の例を使用できます。

非同期実行モードでは、ランタイムに命令を与えると、要求した操作が完了または失敗したときにイベントが送出されます。まず、データベースエンジンに操作を実行するように命令します。データベースエンジンの処理はバックグラウンドで行われ、アプリケーションは引き続き実行されます。操作が完了(または失敗)すると、データベースエンジンがイベントを送出します。そのイベントによってコードがトリガーされて、それに続く操作が実行されます。このアプローチには、データベース操作がバックグラウンドで実行されている間もメインのアプリケーションコードの実行が継続されるという大きな利点があります。データベースの操作に時間がかかったとしても、アプリケーションは引き続き実行されるため、最も重要な点として、画面が動かなくなったりしてユーザーの操作が妨げられることがありません。その一方で、非同期操作のコードは他のコードに比べて記述が難しくなることがあります。一般的には、依存する複数の操作を様々なイベントリスナーメソッドに分割しなければならない場合に記述が難しくなります。

概念的には、操作をステップの 1 つのシーケンス(一連の同期操作)として記述する方が、複数のイベントリスナーメソッドに分割された一連の操作として記述するより簡単です。Adobe AIR では、データベース操作を非同期に実行するほかに、同期的に実行することもできます。同期実行モードでは、操作はバックグラウンドではなく、他のすべてのアプリケーションコードと同じ実行シーケンスで実行されます。データベースエンジンに操作を実行するように命令すると、その時点でコードが一時停止して、その間にデータベースエンジンの処理が行われます。操作が完了すると、コードの次の行から実行が再開されます。

操作を非同期に実行するか同期的に実行するかは、SQLConnection のレベルで設定します。1 つのデータベース接続を使用して、操作やステートメントの一部を同期的に実行し、その他を非同期に実行することはできません。SQLConnection で同期実行モードと非同期実行モードのどちらを使用するかは、データベースを開くための SQLConnection メソッドを呼び出すことによって指定します。 SQLConnection.open() を呼び出すとその接続で同期実行モードが使用され、 SQLConnection.openAsync() を呼び出すと非同期実行モードが使用されます。 open() または openAsync() を使用して SQLConnection インスタンスをデータベースに接続すると、実行モードが同期または非同期のいずれかに固定されます。実行モードを変更するには、データベースへの接続をいったん閉じてもう一度開く必要があります。

各実行モードにはそれぞれ利点があります。ほとんどの面は似ていますが、各モードを使用するときに頭に入れておく必要がある違いがいくつかあります。これらのトピックの詳細と、各モードを使用する際のヒントについては、 同期および非同期のデータベース操作の使用 を参照してください。