package com.android_mvc.framework.db.schema;
import android.database.sqlite.SQLiteDatabase;
import com.android_mvc.framework.common.FWUtil;
/**
* SQLiteの1つのテーブル定義を表すクラス。
* @author id:language_and_engineering
*
*/
public class RDBTable
{
// NOTE: Railsのマイグレーションをお手本に。
// Java上でDDLに型安全性を持ち込むと同時に,テーブル構築のDSLを提供。
// NOTE: setterをDSLとしてユーザに利用させるためにはprivate宣言する必要がある。
// 補完機能でメンバを出させないために。
private String table_name;
private RDBColumn[] columns;
private SQLiteDatabase db;
/**
* コンストラクタ。引数によってdbへのポインタを確保しておく。
*/
public RDBTable( AbstractSchemaDefinition schemaDefinition )
{
this.db = schemaDefinition.getDB();
}
/**
* テーブル名をセット。
* テーブルに対応するエンティティがORM側に存在する場合,二重表記を避けるために
* エンティティからテーブル名を呼び出すことが望ましい。
*/
public RDBTable nameIs(String table_name)
{
this.table_name = table_name;
return this;
}
/**
* 全カラムをセット
*/
public RDBTable columns(RDBColumn[] columns)
{
this.columns = columns;
return this;
}
/**
* このテーブルを作成
*/
public RDBTable create()
{
FWUtil.d("テーブル「" + table_name + "」の作成を開始。");
// DDLを作成
String ddl = this.toSQLString();
// 構築実行
db.execSQL( ddl );
FWUtil.d("テーブル「" + table_name + "」の作成が完了。DDL文:\n" + ddl);
return this;
}
/**
* このテーブルのDDLを構築する。
*/
private String toSQLString()
{
String sql = "";
sql += "CREATE TABLE " + table_name + " (\n";
// 全カラムについて
for( int i = 0; i < columns.length; i ++ )
{
// DIARY: 拡張for文を書かないと多少の罪悪感に襲われるのだが,
// 末尾判定が必要なのでしょうがない。一番シンプル。
// ていうかいつも思うのだが,他言語のようにjoin("\n,")ぐらいできてほしい。
// Javaよ,Ruby化してくれ。静的でクローズドクラスなかわりに,APIの充実だけでいいから。
// 生産性や可読性が悪すぎる。
// 1カラム分の定義を付与
RDBColumn column = columns[ i ];
sql += " " + column.toSQLString();
// 末尾でない?
if( i != columns.length - 1 )
{
sql += ",";
}
sql += "\n";
}
sql += ");";
return sql;
}
}