Adobe AirアプリケーションでSQLiteをつかう
2008年9月8日 柴田 一志
AirアプリからローカルのDBを使う
AirでSQLiteを使う方法を試したときの実例を挙げて、使い方を説明します。
参考にしたページ:AIRとSQLiteで学ぶ ローカルDB操作の基本
実際のソースからの例
私が試したときは以下の4つをインポートしました。
import flash.data.SQLConnection; //DBに接続 import flash.events.SQLErrorEvent; //イベント import flash.events.SQLEvent; //イベント import flash.filesystem.File; //ファイル
-
DBへの接続は次のようなファンクションを用意しました。
private function dbConnect():void { //SQLConnectionオブジェクトを作成 con = new SQLConnection(); //オープン成功時とエラー発生時のイベントハンドラを設定 con.addEventListener(SQLEvent.OPEN, openHandler); con.addEventListener(SQLErrorEvent.ERROR, errorHandler); //データベースファイルを参照するFileオブジェクトを生成 //アプリのswfと同じディレクトリにあるdbFile.dbをさしている dbFile = File.applicationDirectory.resolvePath("dbFile.db"); //ファイルが存在するかチェックします if ( dbFile.exists ) { trace( "ファイルは存在します。: " + dbFile.nativePath ); } else { trace( "ファイルは存在しません。: " + dbFile.nativePath ); } // 次の文はcon.openAsync(dbFile); でも同じ働きになります // 第二引数をfalseにするとファイルがないとエラーになる。 //この例のようにしておくと、ファイルを作成する con.openAsync( dbFile, SQLMode.CREATE ); } -
最後のopenAsyncを呼ぶと、成功か、失敗のどちらかのイベントが発生し、設定したイベントハンドラに処理がわたります。
それぞれ、次のようになってます。
//オープン成功時のイベントハンドラ関数 private function openHandler(event:SQLEvent):void { trace("データベースのオープンが成功しました。"); //テーブルがなかったらテーブルを作るファンクションをコール createTable(); } //エラー発生時のイベントハンドラ関数 private function errorHandler(event:SQLErrorEvent):void { trace("データベースのオープンでエラーが発生しました。:" + event.error.message); trace("詳細情報:" + event.error.details); } -
openHandlerのほうはここで終わらず、さらにcreateTableをコールします。
private function createTable():void { //SQLStatementオブジェクトの生成 sqlStmt = new SQLStatement(); //データベース接続先の設定 sqlStmt.sqlConnection = con; //SQL文を保持するString型変数を使用してtextプロパティに設定 //customersというテーブルがなかったらcreateする var sql:String = "CREATE TABLE IF NOT EXISTS customers ( id INTEGER PRIMARY KEY, name TEXT, carNum INTEGER )"; sqlStmt.text = sql; //イベントハンドラの設定 sqlStmt.addEventListener(SQLEvent.RESULT, createOK ); sqlStmt.addEventListener(SQLErrorEvent.ERROR, createError ); //SQL文をデータベースに送信 sqlStmt.execute(); } //テーブル作成時のイベントハンドラ関数 private function createOK(event:SQLEvent):void { //customersテーブルから全てのレコードを持ってくるファンクションをコール selectData(); } //表作成エラー発生時のイベントハンドラ関数 private function createError(event:SQLErrorEvent):void { trace("表の作成でエラーが発生しました。:" + event.error.message); trace("詳細情報:" + event.error.details); }ここで出てきたSQLStatementがsql実行に使われるクラスです。textプロパティに実行したいsqlをセットしてexecuteメソッドを実行します。
-
createOKではさらにselectDataをコールしてます。これはテーブルの全データを読み出すファンクションです。イベントハンドラでそのリザルトをデータグリッドのデータプロバイダにバインドしている変数にセットします。
private function selectData():void { sqlStmt = new SQLStatement(); sqlStmt.sqlConnection = con; //customersテーブルの全レコードを持ってくる var sql:String = "SELECT * FROM customers"; sqlStmt.text = sql; sqlStmt.addEventListener(SQLEvent.RESULT, selectOK ); sqlStmt.addEventListener(SQLErrorEvent.ERROR, selectError ); sqlStmt.execute(); } private function selectOK(event:SQLEvent):void { trace("データの取得が成功しました。"); sqlStmt.removeEventListener(SQLEvent.RESULT, selectOK ); sqlStmt.removeEventListener(SQLErrorEvent.ERROR, selectError ); //結果セットを取り出すために、SQLResultインスタンスを取得 var result:SQLResult = sqlStmt.getResult(); //データグリッドのデータプロバイダにバインドしているdgDataに返ってきた値をセット dgData = new ArrayCollection(result.data); } -
次に示すのはアップデートの例です。入力された値で上書きします。
private function updateData():void { sqlStmt = new SQLStatement(); sqlStmt.sqlConnection = con; var sql:String = "UPDATE customers SET id = :id, name = :name, carNum = :carNum WHERE id = :id"; sqlStmt.text = sql; //各テキストボックスに入力された値を //名前付パラメータにセットする sqlStmt.parameters[":id"] = idInput2.text; sqlStmt.parameters[":name"] = nameInput2.text; sqlStmt.parameters[":carNum"] = carNumInput2.text; sqlStmt.addEventListener(SQLEvent.RESULT, updateOK ); sqlStmt.addEventListener(SQLErrorEvent.ERROR, updateError ); sqlStmt.execute(); } -
おおまかに、こんな感じです。
・Fileでファイル管理
・SQLConnectionでDBに接続
・SQLStatementでsql発行
・SQLEvent、SQLErrorEventにイベントハンドラを設定
といったところです。トランザクションもあるそうですが、まだ試してません。
by 柴田 一志


