package com.golshadi.majid.database;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;
import com.golshadi.majid.Utils.helper.SqlString;
import com.golshadi.majid.core.enums.QueueSort;
import com.golshadi.majid.core.enums.TaskStates;
import com.golshadi.majid.database.constants.TABLES;
import com.golshadi.majid.database.constants.TASKS;
import com.golshadi.majid.database.elements.Task;
import java.util.ArrayList;
import java.util.List;
/**
* Created by Majid Golshadi on 4/10/2014.
*/
public class TasksDataSource {
private SQLiteDatabase database;
public void openDatabase(DatabaseHelper dbHelper) {
database = dbHelper.getWritableDatabase();
}
public long insertTask(Task task){
long id = database
.insert(TABLES.TASKS, null, task.convertToContentValues());
return id;
}
public boolean update(Task task){
int affectedRow = database
.update(TABLES.TASKS, task.convertToContentValues(), TASKS.COLUMN_ID+"="+task.id, null);
if (affectedRow != 0)
return true;
return false;
}
public List<Task> getTasksInState(int state) {
List<Task> tasks = new ArrayList<Task>();
String query;
if (state < 6)
query = "SELECT * FROM "+TABLES.TASKS+" WHERE "+TASKS.COLUMN_STATE+"="+ SqlString.Int(state);
else
query = "SELECT * FROM "+TABLES.TASKS;
Cursor cr = database.rawQuery(query, null);
if (cr != null){
cr.moveToFirst();
while (!cr.isAfterLast()) {
Task task = new Task();
task.cursorToTask(cr);
tasks.add(task);
cr.moveToNext();
}
cr.close();
}
return tasks;
}
public List<Task> getUnnotifiedCompleted() {
List<Task> completedTasks = new ArrayList<Task>();
// SQLite does not have a separate Boolean storage class. Instead, Boolean values are stored as integers 0 (false) and 1 (true).
String query = "SELECT * FROM "+TABLES.TASKS+" WHERE "+TASKS.COLUMN_NOTIFY+" != "+SqlString.Int(1);
Cursor cr = database.rawQuery(query, null);
if (cr != null){
cr.moveToFirst();
while (!cr.isAfterLast()){
Task task = new Task();
task.cursorToTask(cr);
completedTasks.add(task);
cr.moveToNext();
}
cr.close();
}
return completedTasks;
}
public List<Task> getUnCompletedTasks(int sortType) {
List<Task> unCompleted = new ArrayList<Task>();
String query = "SELECT * FROM " + TABLES.TASKS
+ " WHERE " + TASKS.COLUMN_STATE + "!=" + SqlString.Int(TaskStates.END);
switch (sortType){
case QueueSort.HighPriority:
query += " AND "+TASKS.COLUMN_PRIORITY+"="+SqlString.Int(1);
break;
case QueueSort.LowPriority:
query += " AND "+TASKS.COLUMN_PRIORITY+"="+SqlString.Int(0);
break;
case QueueSort.oldestFirst:
query += " ORDER BY "+TASKS.COLUMN_ID+" ASC";
break;
case QueueSort.earlierFirst:
query += " ORDER BY "+TASKS.COLUMN_ID+" DESC";
break;
case QueueSort.HighToLowPriority:
query += " ORDER BY "+TASKS.COLUMN_PRIORITY+" ASC";
break;
case QueueSort.LowToHighPriority:
query += " ORDER BY "+TASKS.COLUMN_PRIORITY+" DESC";
break;
}
Cursor cr = database.rawQuery(query, null);
if (cr != null) {
cr.moveToFirst();
while (!cr.isAfterLast()) {
Task task = new Task();
task.cursorToTask(cr);
unCompleted.add(task);
cr.moveToNext();
}
cr.close();
}
return unCompleted;
}
public Task getTaskInfo(int id) {
String query = "SELECT * FROM " + TABLES.TASKS + " WHERE " + TASKS.COLUMN_ID + "=" +SqlString.Int(id);
Cursor cr = database.rawQuery(query, null);
Task task = new Task();
if (cr != null && cr.moveToFirst()) {
task.cursorToTask(cr);
cr.close();
}
return task;
}
public Task getTaskInfoWithName(String name) {
String query = "SELECT * FROM "+TABLES.TASKS+" WHERE "+TASKS.COLUMN_NAME+"="+SqlString.String(name);
Cursor cr = database.rawQuery(query, null);
Task task = new Task();
if (cr != null && cr.moveToFirst()) {
task.cursorToTask(cr);
cr.close();
}
return task;
}
public boolean delete(int taskID) {
int affectedRow = database
.delete(TABLES.TASKS, TASKS.COLUMN_ID + "=" + SqlString.Int(taskID), null);
if (affectedRow != 0)
return true;
return false;
}
public boolean containsTask(String name) {
boolean result = false;
String query = "SELECT * FROM "+ TABLES.TASKS +" WHERE "+ TASKS.COLUMN_NAME+"="+SqlString.String(name);
Cursor cr = database.rawQuery(query, null);
if (cr != null && cr.getCount() != 0) {
result = true;
cr.close();
}
return result;
}
public boolean checkUnNotifiedTasks() {
ContentValues contentValues = new ContentValues();
contentValues.put(TASKS.COLUMN_NOTIFY, 1);
int affectedRows = database.update(TABLES.TASKS, contentValues, TASKS.COLUMN_NOTIFY+"="+SqlString.Int(0), null);
return affectedRows>0;
}
public void close() {
database.close();
}
}