ActionScript
AIR
sqlite
AirRecord

AIRでのsqlite環境をActiveRecordパターンにして快適に!ついでにByteArrayを扱えるように。

More than 5 years have passed since last update.

AIRでSQLiteを扱うにあたって、太田憲治氏が公開されているAirRecordが大変重宝します。

導入まだの人はぜひこちら!

ADB開発中!Adobe Developer Box 開発日記 連載4) AIRによるActiveRecordの実装

AirRecordは、ActiveRecordというデザインパターンにもとづき設計されたライブラリなんですが、データベースの操作をあまり意識させないような作りになっているので、ネイティブのデーターを扱うだけでDBとの連携が出来てしまうという、いちぢるしく使い勝手の良いライブラリです。

そういうふうに書くと、簡単に扱える代わりに機能が限られてるんじゃないの?といぶかしむ人もいるかもしれないですが、アソシエーションの考え方でテーブルの連結なんかも非常に柔軟で強力に行えますし、もちろん、ガツガツとそのままのSQL文を扱うことも出来ます。

AIR開発に導入しない手はないライブラリのひとつです。

AirRecordの使い方は太田憲治氏自ら執筆されている上記のリンク先を読めば簡単にわかると思います。

ただ、最近悩んだのが、AirRecordがByteArrayの保存ができないということです。

sqliteはデータ型としてBLOB型(ビックラージオブジェクト。最後のBは何だ?オブジェクトのオブの部分?)をサポートしているので、ここにそのままByteArrayを放り込みたいところですが、AirRecordを介すると、ByteArrayがString型でSQL文に入れられてしまうのでsql構文エラーが発生してしまいます。

sqlite側の型をTEXTにして、ByteArrayをBase64エンコーディングすればいいじゃないかと思うかもしれませんが、Base64エンコードってわりとマシンパワー食うので、嫌なんです。

せっかくバイナリをそのまま保存して取り出せる仕組みがあるのに、一旦Stringに変換なんてしたくないんです。

ほとほと困っていましたが、対応をアップされている方がいらっしゃいました。

ActiveRecordは、ByteArrayを保存できない

差分ソースを公開されているので、そのように書き換えていくことでAirRecordがByteArrayにも対応する伝説神ライブラリへと昇華します。

ただ、私の環境では、AirRecord1.2に何点か追加で書き加える必要があったので記しておきます。


jp.cre8system.framework.airrecord.db.ARDatabase

public function insert(table:String, data:Object, name:String = ""):SQLResult

{
var driver:ARDriver = this._driver[name];
var query:String = "INSERT INTO " + table + "(";
var fields:Array = [];
var key:String;
for (key in data)
{
fields.push(driver.field(key));
}
query = query + fields.join(",") + ") VALUES(";
var values:Array = [];
for (key in data)
{
values.push(driver.value(key, data[key]));//valueへの第一引数にkeyを追加
}
query = query + values.join(",") + ")";
return this.query(query, name);
}


jp.cre8system.framework.airrecord.db.ARSQLite

public function createCondition(field:String, value:*):String

{
return this.field(field) + '=' + this.value(field, value);
}

あと、SqlStatementのパラメーターが初期化されなかったので、ここも1行だけ書き足してみました。


jp.cre8system.framework.airrecord.db.ARSQLite

public function query(connection:SQLConnection, query:String):SQLResult

{
//SQLStatementクラスを使用して接続先と
//実行するSQL構文を書きます
if (sqlStatement == null || sqlStatement.sqlConnection !== connection)
{
sqlStatement = new SQLStatement();
sqlStatement.sqlConnection = connection;
}
sqlStatement.text = query;

// バイナリパラメータの設定
for(var key:String in _binaryValues) {
var val:* = _binaryValues[key];

sqlStatement.parameters[":" + key] = val;
}
clear_binary_values();

//実行
sqlStatement.execute();
//※※クエリを実行した後にパラメーターを消去。
sqlStatement.clearParameters();
return sqlStatement.getResult();
}


素晴らしいライブラリと、素晴らしい改造に感謝です!