homeへのリンクです。

SQLiteを使ったAIRのオフライン運用術 その3

2007年12月01日

DEMO2の話。

DEMO2は
・カスタムデータクラス
・itemClassプロパティ
の使い方の説明です。

DEMO2は、DEMO1に上の2つ点について修正を加えたサンプルです。

デモンストレーションで実行される処理自体はDEMO1と全く同じです。

DEMO2ではDEMO1と比べて、まず、SQLiteからデータをロードするsqliteLoad()メソッドの以下の部分が変更されています。

private function sqliteLoad():void{
   var load:SQLStatement = new SQLStatement();
   load.sqlConnection = db;
   load.text = "select * from TEST_TABLE1";
   load.itemClass = testDataClass;※1
   load.execute();
   load.addEventListener(SQLEvent.RESULT,loadHandler,false,0,true);		}

※1SQLStatementインスタンスのitemClassプロパティにtestDataClassが設定されています。
testDataClassの定義は以下のようになっています。

package{
   public class testDataClass{
      private var _col1:Number;
      private var _col2:String;
      private var _col3:Boolean;
      public function get col1():Number{
         return _col1;
      }
      public function set col1(val:Number):void{
         _col1 = val;
      }
   ・
   ・
   ・
   ・

プロパティに型指定をして、getter,setterメソッドを定義しています。
itemClassに設定できるクラスには、SQLstatementで実行されるSELECT文のresultに含まれるカラム名と同じプロパティを定義しておかなければなりません。
getter,setterメソッドは必須の要素ではありませんが、定義しておくと便利です。

こうすることによって、このSELECT文で返されるデータは、testDataClassのインスタンスのリストとして返されるので、resultデータが格納されている、testdataは、DEMO1のときとは異なり、testDataClassのインスタンスで構成された、ArrayCollectionになっています。

そこで、DEMO2でデータをSQLiteの保存するsqliteSave()メソッド内のソースコードは、以下のように変わっています。

for(var i:int = 0;i < count;i++){					
   var save:SQLStatement = new SQLStatement();
   var obj:testDataClass = testdata[i];※1
   save.sqlConnection = tmpdb;
   save.text = "insert into TEST_TABLE1(col1,col2,col3) values (:data1,:data2,:data3)";
   save.parameters[":data1"] = obj.col1;※2
   save.parameters[":data2"] = obj.col2;
   save.parameters[":data3"] = obj.col3;
   save.execute();
}

※1testdataの要素をtestDataClassの変数に代入。
※2testDataClassのgetterメソッドを利用して、各カラムのデータにアクセス。

DEMO2はごくシンプルな例なので、あまり変化は感じられないのですが、実際にはデータ型の変換などを自動にやってくれるし、カスタムクラスにはデータの利用に必要な演算をメソッドとして追加することなどができるので、resultデータの扱いのセオリーとして覚えておいたほうが良い話でした。