SQLiteを操作するAirアプリケーションを作成する 3-1(Insert編)
前回はテーブル作成のロジックを作成した所まで。
次にinsertするロジックと画面を作成して実際にテーブルにinsertしてみる
- 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); } }
- 続いて画面の方は適当にこんな感じ
</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>
- これでコンパイルしてみて、エラーが出ないことを確認する
- ただし上記コードだとロジック部分に大きな問題がある
- 値のチェックを行なっていない為、全項目を入力しないと正常に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インジェクションの対応の一つとしてプリペアドステートメントを利用する方法があるので、次回辺りにその変更を行う。今回はこれでも書けますよって話。実際書けることは書けるが、書かないほうがいい
- 値のチェックを行なっていない為、全項目を入力しないと正常にInsert出来ない。具体的には
SQLiteを操作するAirアプリケーションを作成する 2(テーブル作成編)
前回DBへ接続するロジックまで記述したので、続いてテーブルを作成するロジックを記述する
- 前回作成した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をさせるよう指定する
- とりあえずこの時点でコンパイルし、エラーが出ない事を確認する
SQLiteを操作するAirアプリケーションを作成する 1(DB接続編)
DBを操作するAirアプリケーションを作成してみる。
MacにはSQLiteがインストールされているので、そのまま使用する
と思ったけどAirは自身がSQLiteを内包しているので特に気にせず扱ってくれる
- 下記のコードで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と同じようなもんかなと思ってる
- とりあえずこの時点でコンパイルし、エラーが出ない事を確認する
LionでAir開発をする 2
LionでAir開発をする 1の続き。Airの開発構築
- Air SDKをここからダウンロードする。現在のバージョンは3.2
- ダウンロード後、任意の場所へ解凍する。前回同様/Users/username/localへコピー
- 環境変数を設定する。bash_profileは前回作成済みなので下記の様に追加する
/Users/username/local/AdobeAIRSDK/bin:/Users/username/local/flex_sdk_4.6/bin
- パスが通ったか確認する。下記コマンドで設定したパスが表示されればOK
which adl
- 試しに下記のコードを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>
- 前回作成したtest.asをamxmlcコマンドでコンパイル。Flexの場合はmxmlc、Airの場合はamxmlcでコンパイルする
amxmlc ./test.as
- adlコマンドで実行。adlコマンドを使うとパッケージ化せずに実行できる
adl ./test.xml
- 正常に実行出来たのを確認し、パッケージ化へ進む。まずは自己署名入り証明書とキーのペアの生成する
adt -certificate -cn SelfSigned 1024-RSA test.p12 testpassword
- test.pfxが作成出来たらAirのインストールファイルを作成する
adt -package -storetype pkcs12 -keystore test.p12 -storepass testpassword test.air test.xml test.swf
- test.airが作成されるので実行してインストールする
- インストール後、Hello World出来れば完了
LionでAir開発をする 1
Flexの環境構築
- Flex SDKをここからダウンロードする。現在のバージョンは4.6
- ダウンロード後、任意の場所へ解凍する。今回は/Users/username/localへコピー
- 環境変数を設定する。
- パスが通ったか確認する。下記コマンドで設定したパスが表示されればOK
which mxmlc
- 試しに下記のコードを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 ); } } }
- 作成したtest.asをコンパイル。Javaのランタイムが入ってないと怒られるので、怒られたらインストールしておく
mxmlc test.as
- test.asと同階層にtest.swfが作成されているのでそれを開く
- Hello WorldできたらFlexの環境構築完了