package com.odoo.orm; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.util.Log; import com.odoo.base.account.BaseAccount; import com.odoo.base.ir.IrAttachment; import com.odoo.base.ir.IrModel; import com.odoo.base.mail.MailFollowers; import com.odoo.base.res.ResPartner; import com.odoo.config.OModules; import com.odoo.support.OModule; import com.odoo.util.PreferenceManager; public class OSQLiteHelper extends SQLiteOpenHelper { public static final String TAG = OSQLiteHelper.class.getSimpleName(); public static final int DATABASE_VERSION = 4; public static final String DATABASE_NAME = "OdooSQLite.db"; Context mContext = null; OModules mModules = null; List<String> mDBTables = new ArrayList<String>(); public OSQLiteHelper(Context context, String dbName) { super(context, dbName, null, DATABASE_VERSION); mContext = context; mModules = new OModules(); } public List<OModel> baseModels() { List<OModel> models = new ArrayList<OModel>(); models.add(new IrModel(mContext)); models.add(new ResPartner(mContext)); models.add(new IrAttachment(mContext)); models.add(new MailFollowers(mContext)); models.add(new BaseAccount(mContext)); return models; } public List<OModel> moduleModels() { List<OModel> models = new ArrayList<OModel>(); for (OModule module : mModules.getModules()) { models.add(module.getModel(mContext)); } return models; } @Override public void onCreate(SQLiteDatabase db) { OSQLHelper sql = new OSQLHelper(mContext); for (OModel model : baseModels()) { sql.createStatements(model); } for (OModule module : mModules.getModules()) { sql.createStatements(module.getModel(mContext)); } for (String query : sql.getStatements()) { db.execSQL(query); } registerModels(sql.getModelName()); registerModelsClassPath(sql.getModelClassPath()); } private void registerModels(List<String> models) { PreferenceManager pfManager = new PreferenceManager(mContext); pfManager.putStringSet("models", models); } private void registerModelsClassPath(HashMap<String, String> modelClassPath) { PreferenceManager pfManager = new PreferenceManager(mContext); for (String key : modelClassPath.keySet()) { // Setting class path pfManager.putString(key, modelClassPath.get(key)); List<String> server_cols = getColumns(modelClassPath.get(key) .toString(), true); pfManager.putStringSet(key + ".server", server_cols); List<String> local_cols = getColumns(modelClassPath.get(key) .toString(), false); pfManager.putStringSet(key + ".local", local_cols); } } private List<String> getColumns(String model_class, boolean server_columns) { List<String> cols = new ArrayList<String>(); try { OModel m = new OModel(mContext, null); Class<?> cls = Class.forName(model_class); OModelHelper model = m.createInstance(cls); for (OColumn col : model.getColumns(!server_columns)) { cols.add(col.getName()); } } catch (Exception e) { e.printStackTrace(); } return cols; } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { for (OModel model : baseModels()) { OSQLHelper sql = new OSQLHelper(mContext); sql.createDropStatements(model); for (String s : sql.getStatements()) { db.execSQL(s); } } // Recreating tables onCreate(db); } private void setDBTables() { SQLiteDatabase db = getReadableDatabase(); Cursor cr = db.query("sqlite_master", new String[] { "name" }, "type = ?", new String[] { "table" }, null, null, null); if (cr.moveToFirst()) { do { String table = cr.getString(0); if (!table.equals("android_metadata") && !table.equals("sqlite_sequence")) { mDBTables.add(table); } } while (cr.moveToNext()); } cr.close(); db.close(); } public boolean hasTable(String table_or_model) { if (mDBTables.size() == 0) setDBTables(); String table = table_or_model; if (table_or_model.contains(".")) { table = table_or_model.replaceAll("\\.", "_"); } if (mDBTables.contains(table)) { return true; } return false; } public boolean cleanUserRecords(String account_name) { Log.d(TAG, "cleanUserRecords()"); if (mDBTables.size() == 0) setDBTables(); SQLiteDatabase db = getWritableDatabase(); for (String table : mDBTables) { int total = 0; total = db.delete(table, "odoo_name = ?", new String[] { account_name }); Log.v(TAG, total + " cleaned from " + table); } db.close(); Log.i(TAG, account_name + " records cleaned"); return true; } }