package com.conference.app.lib.database; import java.util.HashMap; import java.util.Map; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteQueryBuilder; import android.util.Log; import com.conference.app.lib.database.tables.ConferenceTable; import com.conference.app.lib.database.tables.SessionSpeakerTable; import com.conference.app.lib.database.tables.SessionTable; import com.conference.app.lib.database.tables.SessionTrackTable; import com.conference.app.lib.database.tables.SpeakerTable; import com.conference.app.lib.database.tables.TrackTable; public class DatabaseAdapter { private static final String TAG = DatabaseAdapter.class.getName(); private static final boolean DEBUG = false; private static final Map<String, String> TRACK_COLOR_CACHE = new HashMap<String, String>(); private final DatabaseHelper dbHelper; private SQLiteDatabase database; public DatabaseAdapter(final Context ctx) { dbHelper = new DatabaseHelper(ctx); } private void openDB() { if (database == null || !database.isOpen()) { database = dbHelper.getWritableDatabase(); } } private void closeDB() { if (database.isOpen()) { dbHelper.close(); } } // public String getTrackColorByUniqueSessionId(final String uniqueSessionId) { // if (!TRACK_COLOR_CACHE.containsKey(uniqueSessionId)) { // openDB(); // final String query = "select s." + TrackTable.ID + ", s." + TrackTable.COLOR + ", s." // + TrackTable.UNIQUE_ID + " from " + TrackTable.TABLE_NAME + " s, " + SessionTrackTable.TABLE_NAME // + " st where st." + SessionTrackTable.SESSION_ID + "=? AND s." + TrackTable.UNIQUE_ID + " = st." // + SessionTrackTable.TRACK_ID + " ORDER BY s." + TrackTable.ID + " ASC"; // // final Cursor cursor = database.rawQuery(query, new String[] { uniqueSessionId }); // cursor.moveToFirst(); // final String result = cursor.getString(cursor.getColumnIndex(TrackTable.COLOR)); // cursor.close(); // closeDB(); // // TRACK_COLOR_CACHE.put(uniqueSessionId, result); // } // return TRACK_COLOR_CACHE.get(uniqueSessionId); // } public void setFavorite(final String unqiueSessionId, final boolean isFavorite) { final ContentValues values = new ContentValues(); values.put(SessionTable.FAVORITE, isFavorite); openDB(); try { database.beginTransaction(); database.update(SessionTable.TABLE_NAME, values, SessionTable.UNIQUE_ID + "='" + unqiueSessionId + "'", null); database.setTransactionSuccessful(); } catch (final Exception e) { Log.e(TAG, e.getMessage(), e); } finally { database.endTransaction(); } closeDB(); } public void createSessionSpeaker(final ContentValues values) { final boolean entityExists = existsSessionSpeakerEntity(values); openDB(); try { database.beginTransaction(); if (!entityExists) { database.insert(SessionSpeakerTable.TABLE_NAME, null, values); database.setTransactionSuccessful(); } } catch (final Exception e) { Log.e(TAG, e.getMessage(), e); } finally { database.endTransaction(); } closeDB(); } private boolean existsSessionSpeakerEntity(final ContentValues values) { final SQLiteDatabase readDB = dbHelper.getReadableDatabase(); final SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder(); queryBuilder.setTables(SessionSpeakerTable.TABLE_NAME); final Cursor cursor = queryBuilder.query(readDB, SessionSpeakerTable.ALL_COLUMNS, SessionSpeakerTable.SESSION_ID + "='" + values.getAsString(SessionSpeakerTable.SESSION_ID) + "' AND " + SessionSpeakerTable.SPEAKER_ID + "='" + values.getAsString(SessionSpeakerTable.SPEAKER_ID) + "'", null, null, null, null); final boolean result = cursor.getCount() > 0; cursor.close(); return result; } public void createSessionTrack(final ContentValues values) { final boolean entityExists = existsSessionTrackEntity(values); openDB(); try { database.beginTransaction(); if (!entityExists) { database.insert(SessionTrackTable.TABLE_NAME, null, values); database.setTransactionSuccessful(); } } catch (final Exception e) { Log.e(TAG, e.getMessage(), e); } finally { database.endTransaction(); } closeDB(); } private boolean existsSessionTrackEntity(final ContentValues values) { final SQLiteDatabase readDB = dbHelper.getReadableDatabase(); final SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder(); queryBuilder.setTables(SessionTrackTable.TABLE_NAME); final Cursor cursor = queryBuilder.query(readDB, SessionTrackTable.ALL_COLUMNS, SessionTrackTable.SESSION_ID + "='" + values.getAsString(SessionTrackTable.SESSION_ID) + "' AND " + SessionTrackTable.TRACK_ID + "='" + values.getAsString(SessionTrackTable.TRACK_ID) + "'", null, null, null, null); final boolean result = cursor.getCount() > 0; cursor.close(); return result; } public void createOrUpdateConference(final ContentValues values) { createOrUpdateEntity(values, ConferenceTable.TABLE_NAME, ConferenceTable.UNIQUE_ID); } public void createOrUpdateSpeaker(final ContentValues values) { createOrUpdateEntity(values, SpeakerTable.TABLE_NAME, SpeakerTable.UNIQUE_ID); } public void createOrUpdateSession(final ContentValues values) { createOrUpdateEntity(values, SessionTable.TABLE_NAME, SessionTable.UNIQUE_ID); } public void createOrUpdateTracks(final ContentValues values) { createOrUpdateEntity(values, TrackTable.TABLE_NAME, TrackTable.UNIQUE_ID); } private void createOrUpdateEntity(final ContentValues values, final String table, final String identColumn) { final boolean conferenceExists = existsEntity(values.getAsString(identColumn), table, identColumn); openDB(); try { database.beginTransaction(); if (conferenceExists) { final String uniqueId = values.getAsString(identColumn); database.update(table, values, identColumn + "='" + uniqueId + "'", null); } else { database.insert(table, null, values); } database.setTransactionSuccessful(); } catch (final Exception e) { Log.e(TAG, e.getMessage(), e); } finally { database.endTransaction(); } closeDB(); } private boolean existsEntity(final String key, final String table, final String column) { final SQLiteDatabase readDB = dbHelper.getReadableDatabase(); final SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder(); queryBuilder.setTables(table); final Cursor cursor = queryBuilder.query(readDB, new String[] { column }, column + "='" + key + "'", null, null, null, null); final boolean result = cursor.getCount() > 0; cursor.close(); return result; } }