2008年6月3日 火曜日 2:11:28

AIR用のSQLiteライブラリ「AirDB.js」

AIR,プログラム,javascript,WEB開発 [ by Mizugame ]

AirDB.js

AIRでSQLiteをもう少し簡単に使えるように、叩き台用にライブラリ化してみた。
久しぶりのプログラム記事かもしれない。。。(゜◇゜)

AS(Action Script)ではなく、JS(Java Script)用なので注意。

とりあえず、使い方とかを紹介。

ファイルの入手

AirDB.v010.zipからjsファイルを入手。

内容は以下の通り。

  • AirDB.v010.js (オリジナルファイル)
  • AirDB.v010.pack.js (pack圧縮ファイル)

ソースコードは「AIR SQLiteライブラリ AirDB.js ソースコード [ピクスメイト]」で確認できます。

まずは読み込む

AIRプロジェクトのhtmlファイルのヘッダー要素に以下を追加。

<script type="text/javascript" src="AIRAliases.js"></script>
<script type="text/javascript" src="AirDB.v010.js"></script>

AIRのJS用のアクションスクリプトエイリアス群を使うので、「AIRAliases.js」も読み込みます。

使う準備をする

AirDBオブジェクトを読み込む。今回は「$DB」という変数で初期化することとします。

var $DB = new AirDB;
window.addEventListener('unload', $DB.close);

例としてAIRが閉じられるときに、一応データベースを閉じるようにイベントを登録したけど、多分いらない。

データベースをファイルから読み込んで、テーブルを作成

AirDB.connectでファイルからSQLiteに接続、AirDB.createでテーブルを作成します。

try {
  $DB.connect("app:sample.db");
  $DB.create("test", {
    id: 'INTEGER PRIMARY KEY',
    message: 'TEXT'
  });
} catch (error) {
  alert(error.toString());
}

$DB.createでは常にテーブルの存在を確認する「CREATE TABLE IF NOT EXISTS ~」の文法でSQLを組み立てます。

上記の例では結果が返ってくるまで待つ「同期」状態でSQLiteに接続していますが、非同期で接続する場合はAirDB.connectの第2引数にtrueを与えます。

また、AirDB.connectの第3引数には接続直後に実行する関数を与えることができます。

具体的には以下のような感じ。

try {
  $DB.connect("app:sample.db",true, function(){
    $DB.create("test", {
      id: 'INTEGER PRIMARY KEY',
      message: 'TEXT'
    });
  });
} catch (error) {
  alert(error.toString());
}

個人的に長い関数名を打ち込むのがめんどくさいので、AirDB.connectはAirDB.con、AirDB.createはAirDB.creのように短い関数名のエイリアスを張っています。

エイリアスについては、AirDB.v010.jsかソースコードの終わりのほうを見てください(投げやり)

データの挿入とか更新

同期か非同期で、エラーイベントとかの取得とかのタイミングが変わるので、ここからは同期で接続した場合の例です。

データ入力の例

function insertData()
{
  try {
    $DB.insert('test', {
      message : 'message'
    });
  } catch(error) {
    alert(error.toString());
  }
}

こんな感じ。

AirDB.insert(テーブル名:string,インサートデータ:object)で使えます。

トランザクション処理を入れる場合は、AirDB.begin()、AirDB.commit()、AirDB.rollback()が利用できます。

データ更新の例

function updateData()
{
  try {
    $DB.update('test', {
        message : 'update message'
      },
      "WHERE" +
      "  id = '1'"
    );
  } catch(error) {
    alert(error.toString());
  }
}

AirDB.update(テーブル名:string,アップデートデータ:object,絞込条件とか:string)で使えます。

同じ要領で、AirDB.Delete(テーブル名:string,絞込条件とか:string)でデータの削除ができます。
(関数名がdeleteではなくDeleteになってるのは間違いではなく、jsのdeleteと被るから)

とりあえず、AirDB.insertとAirDB.updateは、内部でパラメータを登録してプリペアードで実行するようにしています。
(ただし、AirDB.updateの絞込みとかのWHERE句とかはそのまま)

登録データの取得

データ取得の例

function selectData()
{
  try {
    $DB.select('test',
      ['id','message'],
      "WHERE" +
      "  message not NULL"
    );
  } catch(error) {
    alert(error.toString());
  }

  //ここから結果の表示処理
  result = $DB.getRows();
  if (result != null) {
    var data = new String();
    for (row in result) {
      data += "[" + row + "] " +
              "id: \"" + result[row].id + "\" " +
              "message: \"" + result[row].message + "\"\n";
    }
    alert(data);
  } else {
    alert('データが見つかりません!');
  }
}

こんな感じ。

AirDB.select(テーブル名:string,取得対象カラム:string or array,絞込条件とか:string)で使えます。

まとめ

いろいろ解説サイトとか見て思ったけど、ローカルで扱うのを前提としているためか、意外とプリペアードクエリもエスケープもやってないもの多いね。

一応、エスケープ用にAirDB.escapeも作ったものの、プリペアードの方が便利な気もするし、大雑把にしか対応させてない。
バイナリセーフとか、JSでどうやってるんだろう。

あと、AIRのSQLStatement.textの中にバックスラッシュ(¥)が入ったSQL文を入れた場合、SQLStatement.textを確認するとバックスラッシュが改行になっちゃうのはなぜなんだろう・・・バグ?( ̄□ ̄;)

おかげで、LIKE文用のワイルドカード(%と_)のエスケープができねぇ。

ものすごくハマった上、解決してないんだけど。
・・・そもそもやり方が間違ってる?

そんなわけなんで、AirDB.escapePatternって関数を今のところ残してるんだけど、まったく役に立ちません!

作っててずーっと思ってたけど、やっぱりSQLStatement周りは、中途半端なのでどうにかしないと。

var select = new $DB.select('table', '*');
  select.where(条件);
  select.or(条件);
  select.order(条件);
  select.param('name', 'value');
  select.query();

みたいに操作できるように、個別にオブジェクト化しておきたい。

・・・とりあえず、めんどくさいので。
更新する気になったら、大幅に改造するかも・・・くらいの。

ワイルドカードもパラメータ登録にすれば、どうにかなるかしら?

それにしても、思ったよりAIRの解説サイトって少ないね。
最初はもっと流行るかなと思ってたのに。

お世話になったサイト:
八角研究所 : Series: API で覚える Adobe AIR «
AIRとSQLiteで学ぶ ローカルDB操作の基本 (1/3) ─ @IT

関連記事:
GMapをXMLで初期化するjQueryプラグイン「jquery.xmap.js」

コメント (0) »