DEMO3はBLOBとByteArrayクラスの使い方のデモンストレーション。
Flex3のヘルプを見た感じだと、ByteArrayクラスは、AMF(ActionScript Message Format)用に、バイナリデータでオブジェクトを扱うためのクラスらしい。
AMFは、Flash Media Serverとコミュニケーションをとるときにflash playerが使うデータ形式。
ActionScriptのオブジェクトをそのままやり取りすることができる。
そうしたやり取りはFlashRemotingと呼ばれています。
SQLite側でBLOBが使えるので、ActionScriptのオブジェクトをバイナリデータで保存したり、読み出したりすることが可能で、それ用のバイナリデータを扱うのにも、ByteArrayクラスが使えるということらしいです。
DEMO3のソースコードではまず、sqliteLoadメソッドの以下の部分が修正されています。
var resary:Array = result.data; var res:ByteArray = resary[0].data as ByteArray;※1 if(res != null){ var ld:ArrayCollection = res.readObject() as ArrayCollection;※2
※1でロード結果のデータをByteArray形式にキャストして、※2でByteArrayクラスのreadObject()でデータを抽出した後、もともとのArrayCollectionクラスデータタイプにキャストしています。
一方、sqliteSave()メソッドの一部は、以下のように修正されています。
var save:SQLStatement = new SQLStatement(); var buffer:ByteArray = new ByteArray();※1 buffer.writeObject(testdata);※2 save.sqlConnection = tmpdb; save.text = "insert into TEST_TABLE1(data) values (:data)"; save.parameters[":data"] = buffer;※3 save.execute();
※1でByteArrayのインスタンスを生成して、※2でByteArrayクラスのメソッドwriteObject()を使って、testdataをバイナリオブジェクトとして、buffer変数に格納しています。
それを※3でSQLStatementのdataパラメータに代入して、SQLiteに保存してもらうという流れ。
データグリッドにバインドされているArrayCollectionをそのままデータ化しているので、DEMO1やDEMO2の用に一々、個々のデータにアクセスして、SQLStatementを実行しなくて良くなっています。
なるほどという感じです。
よく、AMFがAjaxに比べて速いと言う話を聞くのですが、正直、データをバイナリ化できるだけでそんなに違うのか?と思っていたのですが、送信データの生成の部分を考えると、かなり違いが出そうです。
« SQLiteを使ったAIRのオフライン運用術 その3 | MAX 2007 | SQLiteを使ったAIRのオフライン運用術 その5 »