package com.novoda.demo.tddpersistence;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.support.annotation.NonNull;
import com.novoda.demo.tddpersistence.db.TaskReaderDbHelper;
import java.util.ArrayList;
import java.util.List;
import static com.novoda.demo.tddpersistence.db.TaskReaderContract.TaskEntry.*;
public class TaskDBStorage implements TaskStorage {
private final TaskReaderDbHelper taskReaderDbHelper;
public TaskDBStorage(TaskReaderDbHelper taskReaderDbHelper) {
this.taskReaderDbHelper = taskReaderDbHelper;
}
private SQLiteDatabase openDB() {
return taskReaderDbHelper.getWritableDatabase();
}
@Override
public void insert(TaskDBModel taskDBModel) {
SQLiteDatabase db = openDB();
ContentValues values = toContentValues(taskDBModel);
db.insertOrThrow(TABLE_NAME, null, values);
closeDB();
}
@Override
public void delete(TaskDBModel taskDBModel) {
SQLiteDatabase db = openDB();
String selection = COLUMN_TASK_NAME + " LIKE ?";
String[] selectionArgs = {taskDBModel.getName()};
db.delete(TABLE_NAME, selection, selectionArgs);
closeDB();
}
private void closeDB() {
taskReaderDbHelper.close();
}
@NonNull
private ContentValues toContentValues(TaskDBModel taskDBModel) {
ContentValues values = new ContentValues();
values.put(COLUMN_TASK_NAME, taskDBModel.getName());
values.put(COLUMN_TASK_EXPIRATION, taskDBModel.getExpiration());
return values;
}
@Override
public List<TaskDBModel> findAllExpiredBy(long expirationDate) {
SQLiteDatabase db = openDB();
String selection = COLUMN_TASK_EXPIRATION + " < ?";
String[] selectionArgs = {String.valueOf(expirationDate)};
Cursor cursor = db.query(
TABLE_NAME, // The table to query
dbProjection(), // The columns to return
selection, // The columns for the WHERE clause
selectionArgs, // The values for the WHERE clause
null, // don't group the rows
null, // don't filter by row groups
null
);
return toTaskDBModels(cursor);
}
private String[] dbProjection() {
return new String[]{
COLUMN_TASK_NAME,
COLUMN_TASK_EXPIRATION
};
}
private List<TaskDBModel> toTaskDBModels(Cursor cursor) {
List<TaskDBModel> tasks = new ArrayList<>();
while (cursor.moveToNext()) {
String name = cursor.getString(cursor.getColumnIndexOrThrow(COLUMN_TASK_NAME));
long expiration = cursor.getLong(cursor.getColumnIndexOrThrow(COLUMN_TASK_EXPIRATION));
tasks.add(new TaskDBModel(name, expiration));
}
cursor.close();
closeDB();
return tasks;
}
@Override
public List<TaskDBModel> findAll() {
SQLiteDatabase db = openDB();
Cursor cursor = db.query(
TABLE_NAME, // The table to query
dbProjection(), // The columns to return
null, // The columns for the WHERE clause
null, // The values for the WHERE clause
null, // don't group the rows
null, // don't filter by row groups
null
);
return toTaskDBModels(cursor);
}
@Override
public TaskDBModel findByName(String taskName) {
SQLiteDatabase db = openDB();
String selection = COLUMN_TASK_NAME + " == ?";
String[] selectionArgs = {taskName};
Cursor cursor = db.query(
TABLE_NAME, // The table to query
dbProjection(), // The columns to return
selection, // The columns for the WHERE clause
selectionArgs, // The values for the WHERE clause
null, // don't group the rows
null, // don't filter by row groups
null
);
TaskDBModel task = null;
while (cursor.moveToNext()) {
String name = cursor.getString(cursor.getColumnIndexOrThrow(COLUMN_TASK_NAME));
long expiration = cursor.getLong(cursor.getColumnIndexOrThrow(COLUMN_TASK_EXPIRATION));
task = new TaskDBModel(name, expiration);
}
cursor.close();
closeDB();
return task;
}
}