[Adobe AIR]SQLiteでsqlite_masterにアクセスする

テーブルの情報とかいろいろはいってるsqlite_masterですが、Adobe AIRでこのテーブルにアクセスしても、「テーブルが見つからないよ!!」って言われてアクセス出来ないんですよね。 色々ググってみたところ、このテーブルへのアクセスは出来ないみたいで、代わりにSQLConnectionクラスの"loadSchema"と"getSchemaResult"を使って取得できるみたいです。

コードはこんな感じ。

var file = new air.File('app-storage:/test.sqlite');

var conn = new air.SQLConnection();

// スキーマ情報読み込み完了時に呼び出されるイベント
conn.addEventListener(air.SQLEvent.SCHEMA, function(event){
    var schema = event.target.getSchemaResult();
    for(var i = 0; i < schema.tables.length; i++){
        var table = schema.tables[i];
        air.trace('name: ' + table.name);

        var columns = table.columns;
        for(var j = 0; j < columns.length; j++){
            var column = columns[j];
            air.trace('    ' + column.name + ': ' + column.dataType);
        }
        air.trace('');
    }
});
conn.addEventListener(air.SQLEvent.OPEN, function(e){
    conn.loadSchema(); // スキーマの読み込み
});
conn.openAsync(file);
こんな感じで。

ちなみに、loadSchemaの第二引数にテーブル名を指定すると、そのテーブルだけの情報を取ってこれるみたいです。

conn.loadSchema(null, "userdata");

こんな感じで"userdata"というテーブルのデータだけを引っ張ってこれます。
第一引数はnullにしておきます。ActionScriptの場合はSQLTableSchemaを指定できるようですが、JavaScriptだと例外吐いて落ちました。

getSchemaResultは実行すると結果がスタックから削除されます。つまり、2回呼び出すと2回目の結果は期待したものと違うことになるので注意!
var schema = event.target.getSchemaResult();
var tables = event.target.getSchemaResult().tables;
こんなことやると残念なコトになります。
一回のイベント内でgetSchemaResultを複数回呼ぶと詰むので、一度結果を変数に入れておいたほうがいいです。

loadSchemaの詳しいリファレンスはこちら。
http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/data/SQLConnection.html#loadSchema%28%29

0 件のコメント :

コメントを投稿