homeへのリンクです。

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

2007年12月04日

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に比べて速いと言う話を聞くのですが、正直、データをバイナリ化できるだけでそんなに違うのか?と思っていたのですが、送信データの生成の部分を考えると、かなり違いが出そうです。