データベースの作成
AIRランタイムにはSQLiteというオープンソースのデータベース機能が組み込まれており,
データベースは単一のローカルファイルを使用します。このファイルには可搬性があり,
<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" applicationComplete="openDB()">
<mx:Script>
<![CDATA[
private function openDB():void {
var db:File = File.desktopDirectory.resolvePath("sample.db");
var conn:SQLConnection = new SQLConnection();
conn.addEventListener(SQLEvent.OPEN, openHandler);
conn.addEventListener(SQLErrorEvent.ERROR, errorHandler);
conn.openAsync(db);
}
private function openHandler(e:SQLEvent):void {
trace("DBをオープンしました");
}
private function errorHandler(e:SQLErrorEvent):void {
trace(e.error.message);
}
]]>
</mx:Script>
</mx:WindowedApplication>
上記のコードを実行すると,
なお,
SQLの実行
データベースに対する操作はSQLで行います。SQLを実行するにはSQLStatementオブジェクトを使います。次のコードはテーブルを作成するサンプルです。データベースsample.
<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" applicationComplete="openDB()">
<mx:Script>
<![CDATA[
private var _conn:SQLConnection;
private function openDB():void {
var db:File = File.desktopDirectory.resolvePath("sample.db");
_conn = new SQLConnection();
_conn.addEventListener(SQLEvent.OPEN, openHandler);
_conn.addEventListener(SQLErrorEvent.ERROR, errorHandler);
_conn.openAsync(db);
}
private function openHandler(e:SQLEvent):void {
createTable();
}
private function errorHandler(e:SQLErrorEvent):void {
trace(e.error.message);
}
private function createTable():void {
var sql:SQLStatement = new SQLStatement();
sql.sqlConnection = _conn;
sql.text =
"CREATE TABLE IF NOT EXISTS menu (" +
" food TEXT," +
" price NUMERIC" +
")";
sql.addEventListener(SQLEvent.RESULT, resultHandler);
sql.addEventListener(SQLErrorEvent.ERROR, errorHandler);
sql.execute();
}
private function resultHandler(e:SQLEvent):void {
trace("テーブル作成済み");
}
]]>
</mx:Script>
</mx:WindowedApplication>
上のサンプルではcreateTable()メソッド内でSQLを実行しています。SQLStatementオブジェクトのsqlConnectionプロパティには実行対象のデータベースを指定します。値はSQLConnectionオブジェクトです。その上でtextプロパティにSQL文を設定し,
レコードの操作結果
レコードの挿入や抽出等の操作を行った場合も,
private var _conn:SQLConnection;
private var _sql:SQLStatement;
/* データベースへの接続処理等は省略 */
private function insertRecords():void {
_sql = new SQLStatement();
_sql.sqlConnection = _conn;
_sql.text = "INSERT INTO menu (food, price) VALUES ('牛丼', 280)";
_sql.addEventListener(SQLEvent.RESULT, insertResultHandler);
_sql.execute();
}
private function insertResultHandler(e:SQLEvent):void {
var result:SQLResult = _sql.getResult();
trace(result.lastInsertRowID);
}
コードから分かるように,
次のコードはpriceカラムが100以下のレコードを抽出する例です。
private var _conn:SQLConnection;
private var _sql:SQLStatement;
/* データベースへの接続処理等は省略 */
private function selectRecords():void {
_sql = new SQLStatement();
_sql.sqlConnection = _conn;
_sql.text = "SELECT * FROM menu WHERE price <= 100";
_sql.addEventListener(SQLEvent.RESULT, selectResultHandler);
_sql.execute();
}
private function selectResultHandler(e:SQLEvent):void {
var result:SQLResult = _sql.getResult();
var records:Array = result.data;
if (records != null) {
trace(records.length + "件ヒットしました");
for each (var item:* in records) {
trace(item.food, item.price);
}
} else {
trace("ヒットなし");
}
}
今度はSQLResultオブジェクトのdataプロパティを取得しています。これは抽出したレコードの配列です。各要素はカラム名をプロパティとするObjectオブジェクトです。レコードが1件も一致しなかった場合,