package net.bradmont.supergreen;
import net.bradmont.supergreen.models.*;
import net.bradmont.supergreen.fields.*;
import android.database.sqlite.*;
import android.content.Context;
import android.util.Log;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* Handle connecting our DBModels to the SQLite database.
* Lifecycle:
* DBModel() -- constructor
* registerModel() for each model
* getReadableDatabase or getWritableDatabase -- this is when the
* lifting is done; create & update aren't called until now
* all models must be registered before this is done.
*/
public abstract class DBHelper extends SQLiteOpenHelper {
// data members:
protected static final String DATABASE_NAME="supergreen.sqlite";
protected Context context;
private static LinkedHashMap<String, DBModel> models = new LinkedHashMap<String, DBModel>();
/**
* register a model
*/
public void registerModel(DBModel model){
models.put(model.getTableName(), model);
Log.d("net.bradmont.supergreen.DBHelper", "Reistering model " + model.getTableName());
}
/**
* Creates tables for each registered model
*/
public void createDatabase(SQLiteDatabase db){
Log.d("net.bradmont.supergreen.DBHelper", "Creating Database");
Log.d("net.bradmont.supergreen.DBHelper", "" + models.size() + " models" );
for (Map.Entry<String, DBModel> entry: models.entrySet()){
DBModel model = entry.getValue();
Log.d("net.bradmont.supergreen.DBHelper", "Executing SQL:" + model.generateCreateSQL());
db.execSQL(model.generateCreateSQL());
String [] queries = model.generateInitializeSQL();
for (int i=0; queries != null && i < queries.length; i++){
String sql=queries[i];
db.execSQL(sql);
}
}
}
public void updateDatabase(SQLiteDatabase db, int oldVersion, int newVersion){
for (Map.Entry<String, DBModel> entry: models.entrySet()){
DBModel model = entry.getValue();
String [] queries = model.generateUpdateSQL(oldVersion);
for (int i=0; queries != null && i < queries.length; i++){
String sql=queries[i];
db.execSQL(sql);
}
}
}
public DBHelper(Context c, int database_version) {
super(c, DATABASE_NAME, null, database_version);
registerModels();
context = c;
}
public Context getContext(){
return context;
}
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){
updateDatabase(db, oldVersion, newVersion);
}
public void onCreate(SQLiteDatabase db){
registerModels();
createDatabase(db);
}
public static DBModel getReferenceModel(String model){
return models.get(model);
}
protected abstract void registerModels();
public synchronized void close(){
super.close();
for (Map.Entry<String, DBModel> entry: models.entrySet()){
DBModel model = entry.getValue();
model.close();
}
models = new LinkedHashMap<String, DBModel>();
}
}