タイトル募集中3.0

しがないITソルジャーの雑記。

SQLiteでテーブルのカラムを取得する?

舐め回すようにリファレンスを読んでやっとわかった.
SQLConnectionにloadSchemaというメソッドがあるのでこれを使う.

このメソッドは、接続されているデータベースまたはアタッチされている任意のデータベースからスキーマ情報をロードします。
スキーマは、データベースのテーブル、列、インデックスおよびトリガの構造を示すものです。
ロードされているスキーマにアクセスするには、SQLConnection.getSchemaResult() メソッドを使用します。
非同期実行モードでは、処理が正しく完了すると schema イベントが送出され、処理が失敗すると error イベントが送出されます。

説明に↑のようなことがかかれているので,addEventListenerでSQLEvent.SCHEMAイベントを追加(とりあえず試すだけなので他のは省略).
で,openしたらloadSchemaメソッドを呼ぶ.でもってschemaHandlerを書く.SQLConnection.getSchemaResultメソッドは

public function getSchemaResult():SQLSchemaResult

のようになっているので,戻り値はSQLSchemaResult.で,SQLSchemaResultの説明を見ると,

SQLSchemaResult インスタンスには、SQLConnection.loadSchema() メソッドを呼び出した結果の情報が含まれます。 
このインスタンスには、SQLConnection.loadSchema() の呼び出しで使用された引数値に基づき、要求されたスキーマデータを保持する
4つの Array プロパティが含まれます。

となっていて,その4つのプロパティはindices,tables,triggers,views.欲しいのはtablesなので今度はtablesの説明を見る.

SQLTableSchema インスタンスの配列(SQLConnection.loadSchema() の呼び出しで要求)です。

となっているので,今度はSQLTableSchemaの説明をみる.

SQLTableSchema インスタンスは、データベースの特定のテーブルを示す情報を提供します。 
このインスタンスには、テーブルの名前(name プロパティ)、テーブルの作成に使用された SQL ステートメント(sql プロパティ)
およびテーブルの列に関する情報(columns プロパティ)が含まれます。

カラムに関する情報が欲しいので,columnsプロパティの説明を見ると,

このテーブルの列のスキーマ情報を含むSQLColumnSchemaインスタンスの配列です。

となっているので,SQLColumnSchemaを見てみる.nameプロパティで,列の名前を取得できるらしい.
ということでやっとたどり着いた.で,上の流れをプログラムで書くと,↓みたいになると思う.

import flash.data.*;
//〜〜〜〜省略〜〜〜〜
var conn:SQLConnection = new SQLConnection();
conn.addEventListener(SQLEvent.SCHEMA, schemaHandler);
conn.open(file);
conn.loadSchema();
//〜〜〜〜省略〜〜〜〜
private function schemaHandler(event:SQLEvent):void
{
    var schema:SQLSchemaResult = event.target.getSchemaResult();
    for (var i : String in schema.tables[0].columns)
    {
	trace(schema.tables[0].columns[i].name);
    }
}

loadSchemaで指定のテーブルの情報だけ拾えるみたいなことをかいてあるので,もうちょっと調べる.

追記

conn.loadSchema(SQLTableSchema, "tablename");

のように指定すると,そのテーブルの情報だけ拾える.詳しくはloadSchemaのパラメータのところ参照.