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.Priority; import com.whatstodo.models.Task; //TODO Exception handling and logging public class TaskDAOSqlite implements TaskDAO { private final String idClause = DatabaseHelper.TASK_COLUMN_ID + " = ?"; private final String listIdClause = DatabaseHelper.TASK_COLUMN_LIST_ID + "= ?"; private SQLiteDatabase db; private DatabaseHelper dbHelper; public TaskDAOSqlite(Context context) { dbHelper = new DatabaseHelper(context); } @Override public void open() throws SQLException { db = dbHelper.getWritableDatabase(); } @Override public void close() { dbHelper.close(); } @Override public Task getById(long id) { Cursor cursor = db.query(DatabaseHelper.TASK_TABLE, null, DatabaseHelper.TASK_COLUMN_ID + " = " + id, null, null, null, null); Task task = null; if (cursor.moveToFirst()) { task = cursorToTask(cursor); } cursor.close(); return task; } @Override public List<Task> findAll() { Cursor cursor = db.query(DatabaseHelper.TASK_TABLE, null, null, null, null, null, null); List<Task> resultList = cursorToList(cursor); cursor.close(); return resultList; } @Override public Task create(Task entity) { ContentValues values = taskToContentValues(entity); long taskId = db.insert(DatabaseHelper.TASK_TABLE, null, values); if (taskId < 0) { throw new RuntimeException("Cannot insert task into db"); } return getById(taskId); } @Override public Task read(long id) { return getById(id); } @Override public Task update(Task entity) { ContentValues values = taskToContentValues(entity); int updatedRows = db.update(DatabaseHelper.TASK_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(Task entity) { int deleted = db.delete(DatabaseHelper.TASK_TABLE, idClause, new String[] { Long.toString(entity.getId()) }); if (deleted > 1) { throw new RuntimeException("Deleted more than one row with id: " + entity.getId()); } } @Override public void deleteAll(){ db.delete(DatabaseHelper.TASK_TABLE, null, null); } @Override public void deleteByListId(long id) { db.delete(DatabaseHelper.TASK_TABLE, listIdClause, new String[] { Long.toString(id) }); } @Override public List<Task> findByListId(long listId) { Cursor cursor = db.query(DatabaseHelper.TASK_TABLE, null, listIdClause, new String[] { Long.toString(listId) }, null, null, null); List<Task> resultList = cursorToList(cursor); cursor.close(); return resultList; } private ContentValues taskToContentValues(Task entity) { ContentValues values = new ContentValues(); if(entity.getId() != 0) { values.put(DatabaseHelper.TASK_COLUMN_ID, entity.getId()); } values.put(DatabaseHelper.TASK_COLUMN_ADDRESS, entity.getAddress()); values.put(DatabaseHelper.TASK_COLUMN_CALENDAR_CREATED, entity.isCalendarCreated()); if (entity.getDate() != null) { values.put(DatabaseHelper.TASK_COLUMN_DATE, entity.getDate() .getTime()); } values.put(DatabaseHelper.TASK_COLUMN_DONE, entity.isDone()); values.put(DatabaseHelper.TASK_COLUMN_LIST_ID, entity.getListId()); values.put(DatabaseHelper.TASK_COLUMN_NAME, entity.getName()); values.put(DatabaseHelper.TASK_COLUMN_NOTICE, entity.getNotice()); if (entity.getPriority() != null) { values.put(DatabaseHelper.TASK_COLUMN_PRIORITY, entity .getPriority().getId()); } if (entity.getReminder() != null) { values.put(DatabaseHelper.TASK_COLUMN_REMINDER, entity .getReminder().getTime()); } return values; } private List<Task> cursorToList(Cursor cursor) { List<Task> resultList = new ArrayList<Task>(); for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) { resultList.add(cursorToTask(cursor)); } return resultList; } private Task cursorToTask(Cursor cursor) { Task task = new Task(); task.setId(cursor.getLong(cursor .getColumnIndex(DatabaseHelper.TASK_COLUMN_ID))); task.setName(cursor.getString(cursor .getColumnIndex(DatabaseHelper.TASK_COLUMN_NAME))); task.setAddress(cursor.getString(cursor .getColumnIndex(DatabaseHelper.TASK_COLUMN_ADDRESS))); //TODO dont save date as int.. we cant show dates before 1970 :/ long date = cursor.getLong(cursor .getColumnIndex(DatabaseHelper.TASK_COLUMN_DATE)); if (date > 0) { task.setDate(new Date(date)); } long reminderDate = cursor.getLong(cursor .getColumnIndex(DatabaseHelper.TASK_COLUMN_REMINDER)); if(reminderDate > 0) { task.setReminder(new Date(reminderDate)); } task.setDone(cursor.getInt(cursor .getColumnIndex(DatabaseHelper.TASK_COLUMN_DONE)) > 0); task.setListId(cursor.getLong(cursor .getColumnIndex(DatabaseHelper.TASK_COLUMN_LIST_ID))); task.setNotice(cursor.getString(cursor .getColumnIndex(DatabaseHelper.TASK_COLUMN_NOTICE))); task.setPriority(Priority.fromId(cursor.getInt(cursor .getColumnIndex(DatabaseHelper.TASK_COLUMN_PRIORITY)))); task.setCalendarCreated(cursor.getInt(cursor .getColumnIndex(DatabaseHelper.TASK_COLUMN_CALENDAR_CREATED)) > 0); return task; } }