Top > MyPage
 

Adobe AirアプリケーションでSQLiteをつかう

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にイベントハンドラを設定

    といったところです。トランザクションもあるそうですが、まだ試してません。