package org.michenux.drodrolib.db.sqlite; import android.content.Context; import android.database.SQLException; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.database.sqlite.SQLiteOpenHelper; import org.michenux.drodrolib.db.utils.SqlParser; import org.michenux.drodrolib.resources.AssetUtils; import java.io.IOException; public class SQLiteDatabaseHelper extends SQLiteOpenHelper { /** * Sub path in assets directory for sql files */ private static final String SQL_DIR = "sql"; /** * Init sql file */ private static final String CREATEFILE = "create.sql"; /** * Upgrade Sql File prefix */ private static final String UPGRADEFILE_PREFIX = "upgrade-"; /** * Upgrade Sql File suffix */ private static final String UPGRADEFILE_SUFFIX = ".sql"; /** * Android context */ private Context context; /** * @param context androdi context * @param name database name * @param factory cursor factory * @param version database version */ public SQLiteDatabaseHelper(Context context, String name, CursorFactory factory, int version) { super(context, name, factory, version); this.context = context; } /** * {@inheritDoc} * * @see android.database.sqlite.SQLiteOpenHelper#onCreate(android.database.sqlite.SQLiteDatabase) */ @Override public void onCreate(SQLiteDatabase db) { try { execSqlFile(CREATEFILE, db); } catch (IOException exception) { throw new RuntimeException("Database creation failed", exception); } } /** * {@inheritDoc} * * @see android.database.sqlite.SQLiteOpenHelper#onUpgrade(android.database.sqlite.SQLiteDatabase, int, int) */ @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { try { for (String sqlFile : AssetUtils.list(SQL_DIR, this.context.getAssets())) { if (sqlFile.startsWith(UPGRADEFILE_PREFIX)) { int fileVersion = Integer.parseInt(sqlFile.substring(UPGRADEFILE_PREFIX.length(), sqlFile.length() - UPGRADEFILE_SUFFIX.length())); if (fileVersion > oldVersion && fileVersion <= newVersion) { execSqlFile(sqlFile, db); } } } } catch (IOException exception) { throw new RuntimeException("Database upgrade failed", exception); } } /** * @param sqlFile * @param db * @throws SQLException * @throws IOException */ protected void execSqlFile(String sqlFile, SQLiteDatabase db) throws SQLException, IOException { for (String sqlInstruction : SqlParser.parseSqlFile(SQL_DIR + "/" + sqlFile, this.context.getAssets())) { db.execSQL(sqlInstruction); } } }