SQLiteを操作するAirアプリケーションを作成する 3-1(Insert編)

前回はテーブル作成のロジックを作成した所まで。

次にinsertするロジックと画面を作成して実際にテーブルにinsertしてみる

  1. insertのロジックを下記の様に書いてみる
    private function insert():void {
       stmt = new SQLStatement();
       stmt.sqlConnection = sqlConn;
       stmt.text = "INSERT INTO idol (name,height,weight,birthday,bust,waist,hip,age) "+
       "VALUES ("+ 
          "'"+ nameFieldId.text +"',"+
          heightFieldId.text +","+
          weightFieldId.text +","+
          "'"+ birthdayFieldId.text +"',"+
          bustFieldId.text +","+
          waistFieldId.text +","+
          hipFieldId.text +","+
          ageFieldId.text+
       ")";
    				
       try{
          stmt.execute();
          successResult();
       }catch(error:Error){
          errorResult(error);
       }
    }
    
  2. 続いて画面の方は適当にこんな感じ
    </fx:Script>
    <mx:VBox verticalGap="0">
        <mx:Canvas width="100%">
            <mx:Label text="名前" x="{nameFieldId.x}" />
            <mx:Label text="身長" x="{heightFieldId.x}" />
            <mx:Label text="体重" x="{weightFieldId.x}" />
        </mx:Canvas>
        <mx:HBox width="100%">
            <mx:TextInput id="nameFieldId"/>
            <mx:TextInput id="heightFieldId" restrict="[0-9]" maxChars="3"/>
            <mx:TextInput id="weightFieldId"/>
        </mx:HBox>
        <mx:Canvas width="100%">
            <mx:Label text="バスト" x="{bustFieldId.x}" />
            <mx:Label text="ウエスト" x="{waistFieldId.x}" />
            <mx:Label text="ヒップ" x="{hipFieldId.x}" />
        </mx:Canvas>
        <mx:HBox width="100%">
            <mx:TextInput id="bustFieldId"/>
            <mx:TextInput id="waistFieldId"/>
            <mx:TextInput id="hipFieldId"/>
        </mx:HBox>
        <mx:Canvas width="100%">
            <mx:Label text="誕生日" x="{birthdayFieldId.x}" />
            <mx:Label text="年齢" x="{ageFieldId.x}" />
        </mx:Canvas>
        <mx:HBox width="100%">
            <mx:TextInput id="birthdayFieldId"/>
            <mx:TextInput id="ageFieldId" restrict="[0-9]" maxChars="3"/>
        </mx:HBox>
    </mx:VBox>
    <mx:HBox>
    	<mx:Button id="insertBtn" label="登録" click="insert()" />
    </mx:HBox>
    
  3. これでコンパイルしてみて、エラーが出ないことを確認する
  4. ただし上記コードだとロジック部分に大きな問題がある
    • 値のチェックを行なっていない為、全項目を入力しないと正常にInsert出来ない。具体的には
      INSERT INTO idol (name,height,weight,birthday,bust,waist,hip,age) VALUES ('',,,'',,,,)
      というSQLが発行される可能性があり、エラーになってしまう。本来は
      INSERT INTO idol (name,height,weight,birthday,bust,waist,hip,age) VALUES ('',NULL,NULL,'',NULL,NULL,NULL,NULL)
      の様なSQLが発行されるのが望ましい。ハズ。 なので値のチェックを行い、正常なSQL文を作成する必要がある
    • InsertのSQL文に画面上からのデータをただ連結し実行するのはセキュリティ上望ましくなく、このままではSQLインジェクションが起こる可能性がある。SQLインジェクションの対応の一つとしてプリペアドステートメントを利用する方法があるので、次回辺りにその変更を行う。今回はこれでも書けますよって話。実際書けることは書けるが、書かないほうがいい

SQLiteを操作するAirアプリケーションを作成する 2(テーブル作成編)

前回DBへ接続するロジックまで記述したので、続いてテーブルを作成するロジックを記述する

  1. 前回作成したidol.mxmlにテーブル作成のロジックを追加する
       private var sqlConn:SQLConnection = new SQLConnection();
       //追加。DBの操作を行う
       private var stmt:SQLStatement;
    
       sqlConn.openAsync(file);
       //追加。テーブル作成のfunctionを呼び出す
       createTable();
    
       private function createTable():void {
          stmt = new SQLStatement();
          //接続先を設定
          stmt.sqlConnection = sqlConn;
          //実行するSQL文を設定
          stmt.text=
          "CREATE TABLE IF NOT EXISTS idol ("+
          "id INTEGER PRIMARY KEY AUTOINCREMENT,"+
          "height INTEGER,"+
          "weight  INTEGER,"+
          "birthday  NUMERIC,"+
          "blood  TEXT,"+
          "bust  INTEGER,"+
          "waist  INTEGER,"+
          "hip  INTEGER,"+
          "age INTEGER)";
          
          try{
             stmt.execute();
             successResult();
          }catch(error:Error){
             errorResult(error);
          }
        }
    
    • IF NOT EXISTSは作成しようとしているテーブルがすでにある場合は上書きしないオプション
    • PRIMARY KEYは一意性を持たせる。この場合idというカラムは一意となる
    • PRIMARY KEYとしたidの値はシステムに自動採番させたいのでAUTOINCREMENTをさせるよう指定する
  2. とりあえずこの時点でコンパイルし、エラーが出ない事を確認する

SQLiteを操作するAirアプリケーションを作成する 1(DB接続編)

DBを操作するAirアプリケーションを作成してみる。

MacにはSQLiteがインストールされているので、そのまま使用する

と思ったけどAirは自身がSQLiteを内包しているので特に気にせず扱ってくれる

  1. 下記のコードでidol.mxmlを作成し、接続までのロジックを記述する
    <?xml version="1.0" encoding="utf-8"?>
    <mx:WindowedApplication 
    xmlns:mx="library://ns.adobe.com/flex/mx"
    xmlns:fx="http://ns.adobe.com/mxml/2009"
    creationComplete="init()"
    >
     <fx:Script>
      <![CDATA[
       //ファイルクラスを使う為のインポート
       import flash.filesystem.File;
       //DBファイルの作成や接続をする為のインポート
       import flash.data.SQLConnection;
       
       //コネクションを作成
       private var sqlConn:SQLConnection = new SQLConnection();
    			
       private function init():void {
          //ファイルオブジェクトを作成し、DBファイルを指定
          var file:File = File.applicationStorageDirectory.resolvePath("idol.db");
    
          //例外処理
          try{
             //指定のDBファイルを開く。存在しない場合は作成してくれる。
             sqlConn.openAsync(file);
             successResult();
         }catch(error:Error){
            errorResult(error);
          }
       }
       private function successResult():void{
          trace("ok");
       }
       private function errorResult(error:Error):void{
          trace("error");
       }
       ]]>
     </fx:Script>
    </mx:WindowedApplication>
    
    • creationComplete="init()"は画面の描画が完了したらinit()を実行するという意味。creationComplete以外のイベントについてはここを参照
    • applicationStorageDirectoryはAirアプリケーション内を指し、MacではMacintosh HD/Users/username/Library/Preferences/[AirID]/Local Store/になる。[AirID]はxmlのidで設定するもの
    • 非同期にファイルを開きたい場合はopenAsyncを、同期的に開く場合はopenを使用する。ここを参照
    • 例外処理についてはここを参照。Javaと同じようなもんかなと思ってる
  2. とりあえずこの時点でコンパイルし、エラーが出ない事を確認する

LionでAir開発をする 2

LionでAir開発をする 1の続き。Airの開発構築

  1. Air SDKここからダウンロードする。現在のバージョンは3.2
  2. ダウンロード後、任意の場所へ解凍する。前回同様/Users/username/localへコピー
  3. 環境変数を設定する。bash_profileは前回作成済みなので下記の様に追加する
    /Users/username/local/AdobeAIRSDK/bin:/Users/username/local/flex_sdk_4.6/bin
  4. パスが通ったか確認する。下記コマンドで設定したパスが表示されればOK
    which adl
  5. 試しに下記のコードをtest.xmlとして作成してみる
    <?xml version="1.0" encoding="UTF-8"?>
    <application  xmlns="http://ns.adobe.com/air/application/3.2">
        <id>examples.flex.test</id>
        <versionNumber>1.0.0</versionNumber>
        <filename>test</filename>
        <initialWindow>
            <content>test.swf</content>
            <title>Hello World</title>
            <visible>true</visible>
        </initialWindow>
    </application>
    
  6. 前回作成したtest.asをamxmlcコマンドでコンパイル。Flexの場合はmxmlc、Airの場合はamxmlcでコンパイルする
    amxmlc ./test.as
  7. adlコマンドで実行。adlコマンドを使うとパッケージ化せずに実行できる
    adl ./test.xml
  8. 正常に実行出来たのを確認し、パッケージ化へ進む。まずは自己署名入り証明書とキーのペアの生成する
    adt -certificate -cn SelfSigned 1024-RSA test.p12 testpassword
  9. test.pfxが作成出来たらAirのインストールファイルを作成する
    adt -package -storetype pkcs12 -keystore test.p12 -storepass testpassword test.air test.xml test.swf
  10. test.airが作成されるので実行してインストールする
  11. インストール後、Hello World出来れば完了

LionでAir開発をする 1

Flexの環境構築

  1. Flex SDKここからダウンロードする。現在のバージョンは4.6
  2. ダウンロード後、任意の場所へ解凍する。今回は/Users/username/localへコピー
  3. 環境変数を設定する。
    • /.bash_profileがある場合は末尾に追加
    • /.bash_profileがない場合は下記コマンドで作成
      1. .bash_profileを作成
        echo "export PATH=$PATH:/Users/username/local/flex_sdk_4.6/bin" > .bash_profile
      2. .bash_profileの変更を反映
        source ./.bash_profile
  4. パスが通ったか確認する。下記コマンドで設定したパスが表示されればOK
    which mxmlc
  5. 試しに下記のコードをtest.asとして作成してみる
    package {
     import flash.display.*;
     import flash.text.*;
     
     public class test extends Sprite {
      public function test () {
       var textField : TextField = new TextField();
       textField.text = "Hello World";
       addChild( textField );
      }
     }
    }
    
  6. 作成したtest.asをコンパイル。Javaのランタイムが入ってないと怒られるので、怒られたらインストールしておく
    mxmlc test.as
  7. test.asと同階層にtest.swfが作成されているのでそれを開く
  8. Hello WorldできたらFlexの環境構築完了