« とうとう三十路。。 | トップページ | AIRでスタートアップ登録 »

2008年9月19日 (金)

AIRでSQLを使う

案件でデスクトップアプリ(ガジェット?)を作ることになったので
AIRで試しに作ってみました。結局mProjectorになっちゃったけど。
その時にSQLを使ったのでそのへんを書いてみます。
バージョンは1.1です。

AIRではSQLiteが使えます。
基本的なところは他のSQLと同じかと。

必要なクラスをimport。

import flash.data.SQLConnection;
import flash.data.SQLStatement;
import flash.data.SQLResult;
import flash.data.SQLTableSchema;
import flash.data.SQLSchemaResult;
import flash.events.SQLEvent;
import flash.events.SQLErrorEvent;
import flash.filesystem.File;

変数はこうなってます。

private var sqlCon:SQLConnection;
private var sql:SQLStatement;

まずはデータベースを開きます。
データベースはメモリ内で作成することもできるし、ファイルを作成してそこに保存することもできます。今回のはローカルのファイルに保存するやつです。
ファイル名を「user.db」としてます。
保存場所は「applicationStorageDirectory」を指定してるので「Local Settings」の「Application Data」以下のどっかです。
「SQLEvent.OPEN」をaddEventListenerして、データベースが開かれたら「openedDataBase」が呼ばれるようにします。

private function init():void {
    sqlCon = new SQLConnection();
    sqlCon.addEventListener(SQLEvent.OPEN, openedDataBase);
    var dbFile:File = File.applicationStorageDirectory.resolvePath("user.db");
    sqlCon.open(dbFile);
}
private function openedDataBase(e:SQLEvent):void {
    sqlCon.removeEventListener(SQLEvent.OPEN, openedDataBase);
    createTable();
}

データベースが開かれたらテーブルを作成します。
すでに作成済みの場合は新たに作成する必要はないのですが、そのテーブルが存在するかどうかの確認方法が分からなかったので、SQLのほうで「IF NOT EXISTS」を付け加えて「テーブルが存在してなければ作る」というふうにしました。

SQLを実行する場合はまず「new SQLStatement()」でSQLStatementインスタンスを作成します。
SQL文をそのtextプロパティに入れます。
execute()で実行されます。

private function createTable():void {
    sql = new SQLStatement();
    sql.sqlConnection = sqlCon;
    sql.text=
        "CREATE TABLE IF NOT EXISTS table_name ("+
        " date TEXT,"+
        " comment TEXT"+
        ")";
    sql.addEventListener(SQLEvent.RESULT, createdTable);
    sql.addEventListener(SQLErrorEvent.ERROR,errorCreateTable);
    sql.execute();
}
private function createdTable(e:SQLEvent):void {
    sql.removeEventListener(SQLEvent.RESULT, createdTable);
    sql.removeEventListener(SQLErrorEvent.ERROR,errorCreateTable);
}
private function errorCreateTable(e:SQLErrorEvent):void {
    sql.removeEventListener(SQLEvent.RESULT, createdTable);
    sql.removeEventListener(SQLErrorEvent.ERROR,errorCreateTable);
}

下記のはISNERTする場合です。
SELECTやUPDATE、DELETEをする場合やり方はも同じです。
SQLはSQL文中に「?」を入れて、それに対応するパラメータを配列で指定できます。
「parameters」が配列になってるので、出てくる順番に入れればOKです。

public function insertDayData():void {
    var dt:Date = new Date();
    var date:String = String(dt.time);
    var comment:String = obj.comment;

    sql = new SQLStatement();
    sql.sqlConnection = sqlCon;
    sql.text = "INSERT INTO table_name(date,comment) values(?,?);";
    sql.parameters[0] = date;
    sql.parameters[1] = comment;
    sql.addEventListener(SQLEvent.RESULT, insertedDayData);
    sql.addEventListener(SQLErrorEvent.ERROR,errorInsertDayData);
    sql.execute();
}
private function insertedDayData(e:SQLEvent):void {
    sql.removeEventListener(SQLEvent.RESULT, insertedDayData);
    sql.removeEventListener(SQLErrorEvent.ERROR,errorInsertDayData);
}
private function errorInsertDayData(e:SQLErrorEvent):void {
    sql.removeEventListener(SQLEvent.RESULT, insertedDayData);
    sql.removeEventListener(SQLErrorEvent.ERROR,errorInsertDayData);
}

なんかSQLiteには型というのが存在しないらしいです。
「CREATE TABLE」の時に指定してても意味ないっぽい。
知らずにDate型を指定してたらSELECTでうまく取れなくてしばらくハマってしまった。。
結局は上記のようにミリ秒に直してTEXTとして入れました。

それにしても、なかなかAIR広まらないなあ。。

|

« とうとう三十路。。 | トップページ | AIRでスタートアップ登録 »

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック


この記事へのトラックバック一覧です: AIRでSQLを使う:

« とうとう三十路。。 | トップページ | AIRでスタートアップ登録 »