package com.jdroid.android.sqlite; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import com.jdroid.android.utils.AppUtils; import com.jdroid.java.collections.Lists; import com.jdroid.java.collections.Sets; import com.jdroid.java.utils.LoggerUtils; import org.slf4j.Logger; import java.io.File; import java.util.List; import java.util.Set; public class SQLiteHelper extends SQLiteOpenHelper { private final static Logger LOGGER = LoggerUtils.getLogger(SQLiteHelper.class); private final static String DB_NAME = "application.db"; private Set<String> createSQLs = Sets.newHashSet(); private List<SQLiteUpgradeStep> upgradeSteps = Lists.newArrayList(); public SQLiteHelper(Context context) { super(context, DB_NAME, null, AppUtils.getVersionCode()); } /** * Add a creation SQL statement to be executed in {@link SQLiteHelper#onCreate(SQLiteDatabase)} method. * * @param sql creation statement */ public void addCreateSQL(String sql) { if (sql != null) { createSQLs.add(sql); } } /** * Add a {@link SQLiteUpgradeStep} to be executed in {@link SQLiteHelper#onUpgrade(SQLiteDatabase, int, int)} * method. * * @param upgradeStep upgrade steps to add. */ public void addUpgradeStep(SQLiteUpgradeStep upgradeStep) { upgradeSteps.add(upgradeStep); } public void addUpgradeSteps(List<SQLiteUpgradeStep> upgradeSteps) { this.upgradeSteps.addAll(upgradeSteps); } @Override public void onCreate(SQLiteDatabase db) { for (String createSQL : createSQLs) { LOGGER.debug("Executing create SQL: " + createSQL); db.execSQL(createSQL); } } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { LOGGER.debug("Upgrading DB from version " + oldVersion + " to " + newVersion); for (SQLiteUpgradeStep upgradeStep : upgradeSteps) { if (upgradeStep.getVersion() > oldVersion) { LOGGER.debug("Executing upgrade step " + upgradeStep.getClass().getSimpleName()); upgradeStep.upgrade(db, oldVersion, newVersion); } } } @Override public void onOpen(SQLiteDatabase db) { super.onOpen(db); if (!db.isReadOnly()) { // Enable foreign key constraints support db.execSQL("PRAGMA foreign_keys=ON;"); } } /** * Verify if database file exits. * * @param context context * @return true if the file exits */ public static boolean existDatabase(Context context) { return getDatabaseFile(context).exists(); } public static File getDatabaseFile(Context context) { return context.getApplicationContext().getDatabasePath(DB_NAME); } }