Adobe Air‎ > ‎

データの永続化

データの永続化をする方法として2つの方法のご紹介。


SharedObject

SharedObjectは KeyとValueの組み合わせの簡単なデータ。。。例えば、ログイン情報の保持とか、画面のX,Y座標とか。。。にベストマッチ。
使い方も簡単ですので、ちょっとしたものにはこちらを使うといいと思います。
http://livedocs.adobe.com/flex/3/langref/flash/net/SharedObject.html

保存の仕方としても種類があって
  1. ローカルに保存
  2. リモートで保存(複数のクライアントで共有)
があります。
私は試していないんですがリモートで保存した場合、値変更時すると接続している各クライアントに通達が渡って自動的に更新されるような感じ?であれば便利ですね。

ローカルの場合のサンプル

import flash.net.SharedObject;

var sharedObject:SharedObject = SharedObject.getLocal("FileName");
sharedObject.data.user_email = "abc@sample.com";
sharedObject.data.api_key = "ABC";
sharedObject.data.user_id = "user001";
sharedObject.flush();

user_email, api_key, user_id をKEYに保存することができます。
逆に読み込みの場合では
var sharedObject:SharedObject = SharedObject.getLocal("FileName");
email:String = sharedObject.data.user_email
とすればOK!

保存される場所ですが、指定をしなかった場合Macでは、
/Users/{ユーザ名}/Library/Preferences/{プロジェクトID}/Local Store/#SharedObject/
に入っていました。拡張子は .swfみたいです。

プロジェクトIDというのは、AIRの場合ApplicationDescriptor(application.xml)に記述しているIDです。
このIDはユニークになるようなものを指定するのはまぁ当然なんですが、そうしないとファイルカブっちゃぅかもよ?ということですね。


SQLite

AIRでは、組み込みDBとしてSQLiteが使えます。
細かい情報を色々保存したい、検索したい。。。などの場合はこちらの方が便利。

DBのConnectionの作成

const FILE_PATH:String = "app-storage:/MyTest.db";
var file:File = new File(FILE_PATH);
var conn:SQLConnection = new SQLConnection();
conn.addEventListener(SQLEvent.OPEN, function(event:SQLEvent):void {trace("接続成功")}, false, 0, true);
conn.openAsync(file);

SQLLiteはファイルにデータを保存するので、そのファイルをまず作成しています。
app-storageと書くと結局SharedObject同様、プロジェクトのディレクトリが指定されることになるみたい。
つまり、Macだと/Users/{ユーザ名}/Library/Preferences/{プロジェクトID}/Local Store/のところ。

接続を実際開始するのは SQLConnection#openAsync になっていますが、別にSQLConnection#openというのもあります。
openAsyncというのは非同期モードで接続、openというのは同期モードで接続します。
次にSQLを実際実行していく訳ですが、SQL実行した後、処理が完了してから次のコードに行ってほしい場合には同期モード、完了をまたなくてもいいのであれば非同期モードを使います。
非同期モードの場合、それなりの設計をしてないとコンガラガってくると思うのでお試しであればopenの方をおすすめ。

SQLの実行

何かするにはまずテーブルを作成しないといけない訳ですが、SQLの設定、実行するクラスはflash.data.SQLStatementになります。
JDBCも似た感じだから想像つきますよねw

var sql:String = "....";
var stmt:SQLStatement = new SQLStatement();
stmt.sqlConnection = conn;
stmt.text = sql;
stmt.execute();

SQLStatementのクラスにコネクション、SQLを渡して実行!という形です。
sql文は、普通にCREATE TABLE文を書いていけばいいのですが、アプリケーションとしては、
もしテーブルが無かった場合には作りたい
としたいですよね。
そんな場合は "CREATE TABLE IF NOT EXISTS tablename...." としてあげればいいみたい。


結果の取得、エラー情報の取得はSQLStatementにaddEventListenerしてあげます。
  • stmt.addEventListener(SQLEvent.RESULT, onSQLiteExecuteEnd);
  • stmt.addEventListener(SQLErrorEvent.ERROR, onSQLiteExecuteError);

SELECT文でのバインド変数は SQLStatement#parameters のプロパティを使えばOK。
バインドの方法は stmt.parameters[0] と位置を指定したり、名前で指定したりと色々あるみたい。




Comments