package com.whatstodo.persistence; import java.util.ArrayList; import java.util.Date; import java.util.List; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.SQLException; import android.database.sqlite.SQLiteDatabase; import com.whatstodo.models.HistoryEvent; import com.whatstodo.models.HistoryEvent.Action; import com.whatstodo.models.HistoryEvent.Type; public class HistoryEventDAOSqlite implements HistoryEventDAO { private final String idClause = DatabaseHelper.HISTORY_COLUMN_ID + " = ?"; private DatabaseHelper dbHelper; private SQLiteDatabase db; public HistoryEventDAOSqlite(Context context) { dbHelper = new DatabaseHelper(context); } @Override public void open() throws SQLException { db = dbHelper.getWritableDatabase(); } @Override public void close() { dbHelper.close(); } @Override public HistoryEvent getById(long id) { Cursor cursor = db.query(DatabaseHelper.HISTORY_TABLE, null, idClause, new String[] { Long.toString(id) }, null, null, null); HistoryEvent event = null; if (cursor.moveToFirst()) { event = cursorToHistoryEvent(cursor); } cursor.close(); return event; } @Override public List<HistoryEvent> findAll() { Cursor cursor = db.query(DatabaseHelper.HISTORY_TABLE, null, null, null, null, null, null); java.util.List<HistoryEvent> list = cursorToList(cursor); cursor.close(); return list; } @Override public HistoryEvent create(HistoryEvent entity) { ContentValues values = historyEventToContentValues(entity); long eventId = db.insert(DatabaseHelper.HISTORY_TABLE, null, values); return getById(eventId); } @Override public HistoryEvent read(long id) { return getById(id); } @Override public HistoryEvent update(HistoryEvent entity) { ContentValues values = historyEventToContentValues(entity); int updatedRows = db.update(DatabaseHelper.HISTORY_TABLE, values, idClause, new String[] { Long.toString(entity.getId()) }); if (updatedRows > 1) { throw new SQLException("More than one row with the same _ID"); } return getById(entity.getId()); } @Override public void delete(HistoryEvent entity) { throw new UnsupportedOperationException( "Cannot delete an important history event!"); } @Override public void deleteAll() { throw new UnsupportedOperationException( "Cannot delete an important history event!"); } @Override public List<HistoryEvent> find(Type type, Action action, Date after, Long entityUid, Long parentEntityUid, Boolean isSynchronized) { List<String> selectionArgsList = new ArrayList<String>(); StringBuilder builder = new StringBuilder(); if (type != null) { builder.append(DatabaseHelper.HISTORY_COLUMN_TYPE + " = ?"); selectionArgsList.add(type.toString()); } if (action != null) { if (builder.length() > 0) { builder.append(" AND "); } builder.append(DatabaseHelper.HISTORY_COLUMN_ACTION + " = ?"); selectionArgsList.add(action.toString()); } if (after != null) { if (builder.length() > 0) { builder.append(" AND "); } builder.append(DatabaseHelper.HISTORY_COLUMN_TIME_OF_CHANGE + " >= ?"); selectionArgsList.add(Long.toString(after.getTime())); } if (entityUid != null) { if (builder.length() > 0) { builder.append(" AND "); } builder.append(DatabaseHelper.HISTORY_COLUMN_ENTITY_UID + " = ?"); selectionArgsList.add(entityUid.toString()); } if (parentEntityUid != null) { if (builder.length() > 0) { builder.append(" AND "); } builder.append(DatabaseHelper.HISTORY_COLUMN_PARENT_ENTITY_UID + " = ?"); selectionArgsList.add(parentEntityUid.toString()); } if (isSynchronized != null) { if (builder.length() > 0) { builder.append(" AND "); } builder.append(DatabaseHelper.HISTORY_COLUMN_IS_SYNCHRONIZED + " = ?"); selectionArgsList.add(isSynchronized ? "1" : "0"); } String selection = builder.toString(); String[] selectionArgs = selectionArgsList .toArray(new String[selectionArgsList.size()]); Cursor cursor = db.query(DatabaseHelper.HISTORY_TABLE, null, selection, selectionArgs, null, null, null); java.util.List<HistoryEvent> list = cursorToList(cursor); cursor.close(); return list; } private ContentValues historyEventToContentValues(HistoryEvent entity) { ContentValues values = new ContentValues(); if(entity.getId() != 0) { values.put(DatabaseHelper.HISTORY_COLUMN_ID, entity.getId()); } values.put(DatabaseHelper.HISTORY_COLUMN_ACTION, entity.getAction() .toString()); values.put(DatabaseHelper.HISTORY_COLUMN_TYPE, entity.getType() .toString()); values.put(DatabaseHelper.HISTORY_COLUMN_ENTITY_UID, entity.getEntityUid()); values.put(DatabaseHelper.HISTORY_COLUMN_PARENT_ENTITY_UID, entity.getParentEntityUid()); values.put(DatabaseHelper.HISTORY_COLUMN_IS_SYNCHRONIZED, entity.isSynchronized()); values.put(DatabaseHelper.HISTORY_COLUMN_TIME_OF_CHANGE, entity .getTimeOfChange()); return values; } private List<HistoryEvent> cursorToList(Cursor cursor) { List<HistoryEvent> resultList = new ArrayList<HistoryEvent>(); for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) { resultList.add(cursorToHistoryEvent(cursor)); } return resultList; } private HistoryEvent cursorToHistoryEvent(Cursor cursor) { HistoryEvent event = new HistoryEvent(); event.setId(cursor.getLong(cursor .getColumnIndex(DatabaseHelper.HISTORY_COLUMN_ID))); event.setAction(Action.valueOf(cursor.getString(cursor .getColumnIndex(DatabaseHelper.HISTORY_COLUMN_ACTION)))); event.setType(Type.valueOf(cursor.getString(cursor .getColumnIndex(DatabaseHelper.HISTORY_COLUMN_TYPE)))); event.setEntityUid(cursor.getLong(cursor .getColumnIndex(DatabaseHelper.HISTORY_COLUMN_ENTITY_UID))); event.setParentEntityUid(cursor.getLong(cursor .getColumnIndex(DatabaseHelper.HISTORY_COLUMN_PARENT_ENTITY_UID))); event.setSynchronized(cursor.getLong(cursor .getColumnIndex(DatabaseHelper.HISTORY_COLUMN_IS_SYNCHRONIZED)) > 0); event.setTimeOfChange(cursor.getLong(cursor .getColumnIndex(DatabaseHelper.HISTORY_COLUMN_TIME_OF_CHANGE))); return event; } }