Apollo Mini Camp で Apollo for Adobe Flex Developers 等の著者の Mike Chambers さんが AIR から SQLite を導入すると話していましたが、AIR より実際に導入されたので、現在開発中の AIR アプリケーションに実際に実装してみた。もともと必要な情報を FileStream クラスでローカルに xml の様なファイル書き出ししようかと考えていたが、データをもっと Secure に扱いかったので SQLite を使用。まだまだもっと使えて欲しいなあ…という部分もけっこうあるんですが、まあ、Beta の段階だしね。
使用方法は、基本的な SQL 構文の知識と AIR で実装されている SQLConnection class、
SQLStatement class、SQLResult class、File 系の class 辺りを連携させることで、至って簡単に使用することで実現できる。
サンプルソースは下記の通り。
(このサンプルソースではエラー処理は簡略化のため結構省いてます。)
<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication
xmlns:mx="http://www.adobe.com/2006/mxml"
layout="absolute"
width="100%"
height="100%"
creationComplete="init()">
<mx:Script>
<![CDATA[
import flash.events.Event;
import flash.data.SQLConnection;
import flash.data.SQLStatement;
import flash.data.SQLResult;
import flash.filesystem.File;
import mx.controls.Alert;
private var file:File;
private var conn:SQLConnection;
private var stmt:SQLStatement;
// データベース初期設定用関数
private function init():void {
file = new File();
file = File.applicationStorageDirectory.resolve("data");
if(!file.isDirectory) file.createDirectory();
file = file.resolve("sample.sqlite");
conn = new SQLConnection();
conn.addEventListener(SQLEvent.OPEN, onDBOpen);
conn.addEventListener(SQLErrorEvent.ERROR, onDBError);
conn.open(file);
}
private function onDBOpen(evt:SQLEvent):void {
Alert.show("DB 接続成功");
}
private function onDBError(evt:SQLErrorEvent):void {
Alert.show("DB 接続失敗: " + evt.text);
}
// テーブル作成用関数
private function createTable(evt:MouseEvent):void {
var sql:String = "CREATE TABLE tbl_sample (";
sql += "id INTEGER PRIMARY KEY, ";
sql += "title VARCHAR(32) NOT NULL, ";
sql += "rec_time datetime NOT NULL)";
execSQL(sql, function():void { Alert.show("Table 作成成功") });
}
// データ入力用関数
private function insertData(evt:MouseEvent):void {
if(title_txt.text == "") {
Alert.show("タイトルを入力してください。");
return;
}
var sql:String = "INSERT INTO tbl_sample (title, rec_time) ";
sql += "VALUES ('"+ title_txt.text +"', datetime('now','localtime'))";
execSQL(sql, function():void { Alert.show("データ入力成功") });
}
// データ選択用関数
private function selectData(evt:MouseEvent):void {
var sql:String = "SELECT * FROM tbl_sample ORDER BY id DESC";
execSQL(sql, getResult);
}
private function getResult(evt:SQLEvent):void {
var d:String = "";
var result:SQLResult = stmt.getResult();
for each(var obj:Object in result.data) {
for(var col:String in obj) {
d += "column name: " + col + " value: " + obj[col] + "\n";
}
}
data_txt.text = d;
}
// SQL 実行用関数
private function execSQL(sql:String, closure:Function):void {
if(!conn.connected) return;
stmt = new SQLStatement();
stmt.sqlConnection = conn;
stmt.addEventListener(SQLEvent.RESULT, closure);
stmt.addEventListener(SQLErrorEvent.ERROR, onDBError);
stmt.text = sql;
stmt.execute();
}
]]>
</mx:Script>
<mx:VBox>
<mx:FormItem label="タイトル(32文字まで)">
<mx:TextInput id="title_txt" width="300" height="20" maxChars="32" />
</mx:FormItem>
<mx:HBox>
<mx:Button label="テーブルを作成する" click="createTable(event)" />
<mx:Button label="データを入力する" click="insertData(event)" />
<mx:Button label="データを表示する" click="selectData(event)" />
</mx:HBox>
<mx:Spacer height="30" />
<mx:FormItem label="データ表示">
<mx:TextArea id="data_txt" width="400" height="200" />
</mx:FormItem>
</mx:VBox>
</mx:WindowedApplication>











