Fixed bugs, plus moving unit tests towards green. Way closer to there.

pull/14/head
Tim Su 14 years ago
parent 3a48555cc7
commit b729756306

@ -42,7 +42,7 @@ public abstract class DBObject<T extends DBObject<?>> {
}
@Override
public String toString() {
public final String toString() {
StringBuilder sb = new StringBuilder(expression);
if (hasAlias()) {
sb.append(SPACE).append(AS).append(SPACE).append(alias);

@ -33,7 +33,22 @@ public class UnaryCriterion extends Criterion {
@SuppressWarnings("nls")
protected void afterPopulateOperator(StringBuilder sb) {
sb.append(value == null ? "" : value);
if(value == null)
return;
else if(value instanceof String)
sb.append("'").append(sanitize((String) value)).append("'");
else
sb.append(value);
}
/**
* Sanitize the given input for SQL
* @param input
* @return
*/
@SuppressWarnings("nls")
public static String sanitize(String input) {
return input.replace("\\", "\\\\").replace("'", "\\'");
}
public static Criterion neq(Field field, Object value) {

@ -26,6 +26,9 @@ import android.content.Context;
import android.database.Cursor;
import android.util.Log;
import com.todoroo.andlib.service.Autowired;
import com.todoroo.andlib.service.DependencyInjectionService;
/** Abstract controller class. Mostly contains some static fields */
abstract public class AbstractController {
@ -35,11 +38,28 @@ abstract public class AbstractController {
public static final String KEY_ROWID = "_id";
// database and table names
public static final String TASK_TABLE_NAME = "tasks";
public static final String TAG_TABLE_NAME = "tags";
public static final String TAG_TASK_MAP_NAME = "tagTaskMap";
public static final String ALERT_TABLE_NAME = "alerts";
public static final String SYNC_TABLE_NAME = "sync";
@Autowired
protected String tasksTable;
@Autowired
protected String tagsTable;
@Autowired
protected String tagTaskTable;
@Autowired
protected String alertsTable;
@Autowired
protected String syncTable;
// stuff
public AbstractController(Context context) {
this.context = context;
DependencyInjectionService.getInstance().inject(this);
}
abstract public void open();
abstract public void close();

@ -42,7 +42,7 @@ public class AlertController extends AbstractController {
/** Get a cursor to tag identifiers */
public Cursor getTaskAlertsCursor(TaskIdentifier taskId) throws SQLException {
Cursor cursor = alertDatabase.query(ALERT_TABLE_NAME,
Cursor cursor = alertDatabase.query(alertsTable,
Alert.FIELD_LIST, Alert.TASK + " = ?",
new String[] { taskId.idAsString() }, null, null, null);
return cursor;
@ -52,7 +52,7 @@ public class AlertController extends AbstractController {
public List<Date> getTaskAlerts(TaskIdentifier
taskId) throws SQLException {
List<Date> list = new LinkedList<Date>();
Cursor cursor = alertDatabase.query(ALERT_TABLE_NAME,
Cursor cursor = alertDatabase.query(alertsTable,
Alert.FIELD_LIST, Alert.TASK + " = ?",
new String[] { taskId.idAsString() }, null, null, null);
@ -74,7 +74,7 @@ public class AlertController extends AbstractController {
/** Get a list of alerts that are set for the future */
public Set<TaskIdentifier> getTasksWithActiveAlerts() throws SQLException {
Set<TaskIdentifier> list = new HashSet<TaskIdentifier>();
Cursor cursor = alertDatabase.query(ALERT_TABLE_NAME,
Cursor cursor = alertDatabase.query(alertsTable,
Alert.FIELD_LIST, Alert.DATE + " > ?",
new String[] { Long.toString(System.currentTimeMillis()) }, null, null, null);
@ -95,7 +95,7 @@ public class AlertController extends AbstractController {
/** Remove all alerts from the task */
public boolean removeAlerts(TaskIdentifier taskId)
throws SQLException{
return alertDatabase.delete(ALERT_TABLE_NAME,
return alertDatabase.delete(alertsTable,
String.format("%s = ?",
Alert.TASK),
new String[] { taskId.idAsString() }) > 0;
@ -107,7 +107,7 @@ public class AlertController extends AbstractController {
ContentValues values = new ContentValues();
values.put(Alert.DATE, date.getTime());
values.put(Alert.TASK, taskId.getId());
return alertDatabase.insert(ALERT_TABLE_NAME, Alert.TASK,
return alertDatabase.insert(alertsTable, Alert.TASK,
values) >= 0;
}
@ -118,7 +118,7 @@ public class AlertController extends AbstractController {
* opened/created
*/
public AlertController(Context context) {
this.context = context;
super(context);
}
/**
@ -133,7 +133,7 @@ public class AlertController extends AbstractController {
@Override
public void open() throws SQLException {
alertDatabase = new AlertDatabaseHelper(context,
ALERT_TABLE_NAME, ALERT_TABLE_NAME).getWritableDatabase();
alertsTable, alertsTable).getWritableDatabase();
}
/** Closes database resource */

@ -19,20 +19,21 @@
*/
package com.timsu.astrid.data.sync;
import java.util.HashSet;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import com.timsu.astrid.data.AbstractController;
import com.timsu.astrid.data.sync.SyncMapping.SyncMappingDatabaseHelper;
import com.timsu.astrid.data.task.AbstractTaskModel;
import com.timsu.astrid.data.task.TaskIdentifier;
import com.timsu.astrid.data.task.TaskModelForSync;
import java.util.HashSet;
/** Controller for Tag-related operations */
public class SyncDataController extends AbstractController {
@ -45,7 +46,7 @@ public class SyncDataController extends AbstractController {
public boolean clearUpdatedTaskList(int syncServiceId) throws SQLException {
ContentValues values = new ContentValues();
values.put(SyncMapping.UPDATED, 0);
return syncDatabase.update(SYNC_TABLE_NAME, values,
return syncDatabase.update(syncTable, values,
SyncMapping.SYNC_SERVICE + " = " + syncServiceId, null) > 0;
}
@ -53,7 +54,7 @@ public class SyncDataController extends AbstractController {
public boolean addToUpdatedList(TaskIdentifier taskId) throws SQLException {
ContentValues values = new ContentValues();
values.put(SyncMapping.UPDATED, 1);
return syncDatabase.update(SYNC_TABLE_NAME, values,
return syncDatabase.update(syncTable, values,
SyncMapping.TASK + " = " + taskId.getId(), null) > 0;
}
@ -71,7 +72,7 @@ public class SyncDataController extends AbstractController {
/** Get all mappings for the given synchronization service */
public HashSet<SyncMapping> getSyncMappings(int syncServiceId) throws SQLException {
HashSet<SyncMapping> list = new HashSet<SyncMapping>();
Cursor cursor = syncDatabase.query(SYNC_TABLE_NAME,
Cursor cursor = syncDatabase.query(syncTable,
SyncMapping.FIELD_LIST,
SyncMapping.SYNC_SERVICE + " = " + syncServiceId,
null, null, null, null);
@ -94,7 +95,7 @@ public class SyncDataController extends AbstractController {
public HashSet<SyncMapping> getSyncMappings(TaskIdentifier taskId)
throws SQLException {
HashSet<SyncMapping> list = new HashSet<SyncMapping>();
Cursor cursor = syncDatabase.query(SYNC_TABLE_NAME,
Cursor cursor = syncDatabase.query(syncTable,
SyncMapping.FIELD_LIST,
SyncMapping.TASK + " = ?",
new String[] { "" + taskId.getId() },
@ -117,7 +118,7 @@ public class SyncDataController extends AbstractController {
/** Get mapping for given task */
public SyncMapping getSyncMapping(int syncServiceId, TaskIdentifier taskId)
throws SQLException {
Cursor cursor = syncDatabase.query(SYNC_TABLE_NAME,
Cursor cursor = syncDatabase.query(syncTable,
SyncMapping.FIELD_LIST,
SyncMapping.SYNC_SERVICE + " = ? AND " +
SyncMapping.TASK + " = ?",
@ -136,7 +137,7 @@ public class SyncDataController extends AbstractController {
/** Saves the given task to the database. Returns true on success. */
public boolean saveSyncMapping(SyncMapping mapping) {
long newRow = syncDatabase.insert(SYNC_TABLE_NAME, SyncMapping.TASK,
long newRow = syncDatabase.insert(syncTable, SyncMapping.TASK,
mapping.getMergedValues());
mapping.setId(newRow);
@ -150,13 +151,13 @@ public class SyncDataController extends AbstractController {
if(mapping.getId() == 0)
return false;
return syncDatabase.delete(SYNC_TABLE_NAME, KEY_ROWID + "=" +
return syncDatabase.delete(syncTable, KEY_ROWID + "=" +
mapping.getId(), null) > 0;
}
/** Deletes the given mapping. Returns true on success */
public boolean deleteAllMappings(int syncServiceId) {
return syncDatabase.delete(SYNC_TABLE_NAME, SyncMapping.SYNC_SERVICE +
return syncDatabase.delete(syncTable, SyncMapping.SYNC_SERVICE +
"=" + syncServiceId, null) > 0;
}
@ -167,7 +168,7 @@ public class SyncDataController extends AbstractController {
* opened/created
*/
public SyncDataController(Context context) {
this.context = context;
super(context);
}
/**
@ -182,7 +183,7 @@ public class SyncDataController extends AbstractController {
@Override
public synchronized void open() throws SQLException {
SQLiteOpenHelper helper = new SyncMappingDatabaseHelper(context,
SYNC_TABLE_NAME, SYNC_TABLE_NAME);
syncTable, syncTable);
syncDatabase = helper.getWritableDatabase();
}

@ -19,22 +19,23 @@
*/
package com.timsu.astrid.data.tag;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import com.timsu.astrid.data.AbstractController;
import com.timsu.astrid.data.tag.AbstractTagModel.TagModelDatabaseHelper;
import com.timsu.astrid.data.tag.TagToTaskMapping.TagToTaskMappingDatabaseHelper;
import com.timsu.astrid.data.task.AbstractTaskModel.TaskModelDatabaseHelper;
import com.timsu.astrid.data.task.TaskIdentifier;
import com.timsu.astrid.data.task.AbstractTaskModel.TaskModelDatabaseHelper;
import com.timsu.astrid.provider.TasksProvider;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
/** Controller for Tag-related operations */
public class TagController extends AbstractController {
@ -46,7 +47,7 @@ public class TagController extends AbstractController {
public LinkedList<TagModelForView> getAllTags()
throws SQLException {
LinkedList<TagModelForView> list = new LinkedList<TagModelForView>();
Cursor cursor = tagDatabase.query(TAG_TABLE_NAME,
Cursor cursor = tagDatabase.query(tagsTable,
TagModelForView.FIELD_LIST, null, null, null, null, null, null);
try {
@ -77,7 +78,7 @@ public class TagController extends AbstractController {
public LinkedList<TagIdentifier> getTaskTags(TaskIdentifier
taskId) throws SQLException {
LinkedList<TagIdentifier> list = new LinkedList<TagIdentifier>();
Cursor cursor = tagToTaskMapDatabase.query(TAG_TASK_MAP_NAME,
Cursor cursor = tagToTaskMapDatabase.query(tagTaskTable,
TagToTaskMapping.FIELD_LIST, TagToTaskMapping.TASK + " = ?",
new String[] { taskId.idAsString() }, null, null, null);
@ -101,7 +102,7 @@ public class TagController extends AbstractController {
public LinkedList<TaskIdentifier> getTaggedTasks(TagIdentifier tagId)
throws SQLException {
LinkedList<TaskIdentifier> list = new LinkedList<TaskIdentifier>();
Cursor cursor = tagToTaskMapDatabase.query(TAG_TASK_MAP_NAME,
Cursor cursor = tagToTaskMapDatabase.query(tagTaskTable,
TagToTaskMapping.FIELD_LIST, TagToTaskMapping.TAG + " = ?",
new String[] { tagId.idAsString() }, null, null, null);
@ -131,14 +132,14 @@ public class TagController extends AbstractController {
HashSet<Long> ids = new HashSet<Long>();
String[] tagMapColumns = new String[] { TagToTaskMapping.TASK };
Cursor tagMapCursor = tagToTaskMapDatabase.query(TAG_TASK_MAP_NAME,
Cursor tagMapCursor = tagToTaskMapDatabase.query(tagTaskTable,
tagMapColumns, null, null, TagToTaskMapping.TASK, null,
TagToTaskMapping.TASK + " ASC");
SQLiteDatabase taskDatabase = new TaskModelDatabaseHelper(context,
TASK_TABLE_NAME, TASK_TABLE_NAME).getReadableDatabase();
tasksTable, tasksTable).getReadableDatabase();
String[] taskColumns = new String[] { KEY_ROWID };
Cursor taskCursor = taskDatabase.query(TASK_TABLE_NAME, taskColumns,
Cursor taskCursor = taskDatabase.query(tasksTable, taskColumns,
null, null, null, null, KEY_ROWID + " ASC");
LinkedList<TaskIdentifier> list = new LinkedList<TaskIdentifier>();
@ -176,7 +177,7 @@ public class TagController extends AbstractController {
throw new NullPointerException("Name can't be null");
TagModelForView newTag = new TagModelForView(name);
long row = tagDatabase.insertOrThrow(TAG_TABLE_NAME, AbstractTagModel.NAME,
long row = tagDatabase.insertOrThrow(tagsTable, AbstractTagModel.NAME,
newTag.getMergedValues());
return new TagIdentifier(row);
}
@ -186,14 +187,14 @@ public class TagController extends AbstractController {
boolean saveSucessful;
if(tag.getTagIdentifier() == null) {
long newRow = tagDatabase.insert(TAG_TABLE_NAME, AbstractTagModel.NAME,
long newRow = tagDatabase.insert(tagsTable, AbstractTagModel.NAME,
tag.getMergedValues());
tag.setTagIdentifier(new TagIdentifier(newRow));
saveSucessful = newRow >= 0;
} else {
long id = tag.getTagIdentifier().getId();
saveSucessful = tagDatabase.update(TAG_TABLE_NAME, tag.getSetValues(),
saveSucessful = tagDatabase.update(tagsTable, tag.getSetValues(),
KEY_ROWID + "=" + id, null) > 0;
}
@ -202,7 +203,7 @@ public class TagController extends AbstractController {
/** Returns a TaskModelForView corresponding to the given Tag Name */
public TagModelForView fetchTagFromName(String name) throws SQLException {
Cursor cursor = tagDatabase.query(true, TAG_TABLE_NAME,
Cursor cursor = tagDatabase.query(true, tagsTable,
TagModelForView.FIELD_LIST,
AbstractTagModel.NAME + " = ?", new String[] {name}, null, null, null, null);
@ -222,7 +223,7 @@ public class TagController extends AbstractController {
/** Returns a TaskModelForView corresponding to the given TagIdentifier */
public TagModelForView fetchTagForView(TagIdentifier tagId) throws SQLException {
long id = tagId.getId();
Cursor cursor = tagDatabase.query(true, TAG_TABLE_NAME,
Cursor cursor = tagDatabase.query(true, tagsTable,
TagModelForView.FIELD_LIST,
KEY_ROWID + "=" + id, null, null, null, null, null);
@ -243,11 +244,11 @@ public class TagController extends AbstractController {
/** Deletes the tag and removes tag/task mappings */
public boolean deleteTag( TagIdentifier tagId)
throws SQLException{
if(tagToTaskMapDatabase.delete(TAG_TASK_MAP_NAME,
if(tagToTaskMapDatabase.delete(tagTaskTable,
TagToTaskMapping.TAG + " = " + tagId.idAsString(), null) < 0)
return false;
int res = tagDatabase.delete(TAG_TABLE_NAME,
int res = tagDatabase.delete(tagsTable,
KEY_ROWID + " = " + tagId.idAsString(), null);
// notify modification
@ -262,7 +263,7 @@ public class TagController extends AbstractController {
public boolean removeTag(TaskIdentifier taskId, TagIdentifier tagId)
throws SQLException{
int res = tagToTaskMapDatabase.delete(TAG_TASK_MAP_NAME,
int res = tagToTaskMapDatabase.delete(tagTaskTable,
String.format("%s = ? AND %s = ?",
TagToTaskMapping.TAG, TagToTaskMapping.TASK),
new String[] { tagId.idAsString(), taskId.idAsString() });
@ -280,7 +281,7 @@ public class TagController extends AbstractController {
values.put(TagToTaskMapping.TAG, tagId.getId());
values.put(TagToTaskMapping.TASK, taskId.getId());
long res = tagToTaskMapDatabase.insert(TAG_TASK_MAP_NAME, TagToTaskMapping.TAG,
long res = tagToTaskMapDatabase.insert(tagTaskTable, TagToTaskMapping.TAG,
values);
// notify modification
@ -296,7 +297,7 @@ public class TagController extends AbstractController {
* opened/created
*/
public TagController(Context context) {
this.context = context;
super(context);
}
/**
@ -311,9 +312,9 @@ public class TagController extends AbstractController {
@Override
public synchronized void open() throws SQLException {
tagToTaskMapDatabase = new TagToTaskMappingDatabaseHelper(context,
TAG_TASK_MAP_NAME, TAG_TASK_MAP_NAME).getWritableDatabase();
tagTaskTable, tagTaskTable).getWritableDatabase();
tagDatabase = new TagModelDatabaseHelper(context,
TAG_TABLE_NAME, TAG_TABLE_NAME).getWritableDatabase();
tagsTable, tagsTable).getWritableDatabase();
}
/** Closes database resource */

@ -64,7 +64,7 @@ public class TaskController extends AbstractController {
/** Return a list of all active tasks with notifications */
public HashSet<TaskModelForNotify> getTasksWithNotifications() {
HashSet<TaskModelForNotify> list = new HashSet<TaskModelForNotify>();
Cursor cursor = database.query(TASK_TABLE_NAME, TaskModelForNotify.FIELD_LIST,
Cursor cursor = database.query(tasksTable, TaskModelForNotify.FIELD_LIST,
String.format("%s < %d AND (%s != 0 OR %s != 0)",
AbstractTaskModel.PROGRESS_PERCENTAGE,
AbstractTaskModel.COMPLETE_PERCENTAGE,
@ -88,7 +88,7 @@ public class TaskController extends AbstractController {
/** Return a list of all active tasks with deadlines */
public ArrayList<TaskModelForNotify> getTasksWithDeadlines() {
ArrayList<TaskModelForNotify> list = new ArrayList<TaskModelForNotify>();
Cursor cursor = database.query(TASK_TABLE_NAME, TaskModelForNotify.FIELD_LIST,
Cursor cursor = database.query(tasksTable, TaskModelForNotify.FIELD_LIST,
String.format("%s < %d AND (%s != 0 OR %s != 0)",
AbstractTaskModel.PROGRESS_PERCENTAGE,
AbstractTaskModel.COMPLETE_PERCENTAGE,
@ -112,7 +112,7 @@ public class TaskController extends AbstractController {
/** Return a list of all of the tasks with progress < COMPLETE_PERCENTAGE */
public Cursor getActiveTaskListCursor() {
return database.query(TASK_TABLE_NAME, TaskModelForList.FIELD_LIST,
return database.query(tasksTable, TaskModelForList.FIELD_LIST,
AbstractTaskModel.PROGRESS_PERCENTAGE + " < " +
AbstractTaskModel.COMPLETE_PERCENTAGE, null, null, null,
null, null);
@ -120,13 +120,13 @@ public class TaskController extends AbstractController {
/** Return a list of all tasks */
public Cursor getAllTaskListCursor() {
return database.query(TASK_TABLE_NAME, TaskModelForList.FIELD_LIST,
return database.query(tasksTable, TaskModelForList.FIELD_LIST,
null, null, null, null, null, null);
}
/** Return a list of all tasks */
public Cursor getBackupTaskListCursor() {
return database.query(TASK_TABLE_NAME, TaskModelForXml.FIELD_LIST,
return database.query(tasksTable, TaskModelForXml.FIELD_LIST,
AbstractTaskModel.PROGRESS_PERCENTAGE + " < " +
AbstractTaskModel.COMPLETE_PERCENTAGE, null, null, null,
null, null);
@ -134,7 +134,7 @@ public class TaskController extends AbstractController {
/** Delete all completed tasks with date < older than date */
public int deleteCompletedTasksOlderThan(Date olderThanDate) {
return database.delete(TASK_TABLE_NAME, String.format("`%s` >= '%d' AND `%s` <= '%d'",
return database.delete(tasksTable, String.format("`%s` >= '%d' AND `%s` <= '%d'",
AbstractTaskModel.PROGRESS_PERCENTAGE, AbstractTaskModel.COMPLETE_PERCENTAGE,
AbstractTaskModel.COMPLETION_DATE, olderThanDate.getTime()), null);
}
@ -176,14 +176,14 @@ public class TaskController extends AbstractController {
/** Get identifiers for all tasks */
public HashSet<TaskIdentifier> getAllTaskIdentifiers() {
Cursor cursor = database.query(TASK_TABLE_NAME, new String[] { KEY_ROWID },
Cursor cursor = database.query(tasksTable, new String[] { KEY_ROWID },
null, null, null, null, null, null);
return createTaskIdentifierSet(cursor);
}
/** Get identifiers for all non-completed tasks */
public HashSet<TaskIdentifier> getActiveTaskIdentifiers() {
Cursor cursor = database.query(TASK_TABLE_NAME, new String[] { KEY_ROWID },
Cursor cursor = database.query(tasksTable, new String[] { KEY_ROWID },
AbstractTaskModel.PROGRESS_PERCENTAGE + " < " +
AbstractTaskModel.COMPLETE_PERCENTAGE, null, null, null, null, null);
return createTaskIdentifierSet(cursor);
@ -191,7 +191,7 @@ public class TaskController extends AbstractController {
/** Get identifiers for all non-completed, non-hidden tasks */
public HashSet<TaskIdentifier> getActiveVisibleTaskIdentifiers() {
Cursor cursor = database.query(TASK_TABLE_NAME, new String[] { KEY_ROWID },
Cursor cursor = database.query(tasksTable, new String[] { KEY_ROWID },
AbstractTaskModel.PROGRESS_PERCENTAGE + " < " +
AbstractTaskModel.COMPLETE_PERCENTAGE + " AND (" +
AbstractTaskModel.HIDDEN_UNTIL + " ISNULL OR " + AbstractTaskModel.HIDDEN_UNTIL + " < " +
@ -216,7 +216,7 @@ public class TaskController extends AbstractController {
if(idList.size() == 0)
where.append("0");
return database.query(true, TASK_TABLE_NAME,
return database.query(true, tasksTable,
TaskModelForList.FIELD_LIST, where.toString(), null, null,
null, null, null);
}
@ -233,7 +233,7 @@ public class TaskController extends AbstractController {
// notify modification
TasksProvider.notifyDatabaseModification();
return database.delete(TASK_TABLE_NAME, KEY_ROWID + "=" + id, null) > 0;
return database.delete(tasksTable, KEY_ROWID + "=" + id, null) > 0;
}
/** Saves the given task to the database. Returns true on success.
@ -244,7 +244,7 @@ public class TaskController extends AbstractController {
boolean saveSucessful;
if(task.getTaskIdentifier() == null) {
long newRow = database.insert(TASK_TABLE_NAME, AbstractTaskModel.NAME,
long newRow = database.insert(tasksTable, AbstractTaskModel.NAME,
task.getMergedValues());
task.setTaskIdentifier(new TaskIdentifier(newRow));
@ -258,7 +258,7 @@ public class TaskController extends AbstractController {
onTaskSave(task, values, duringSync);
saveSucessful = database.update(TASK_TABLE_NAME, values,
saveSucessful = database.update(tasksTable, values,
KEY_ROWID + "=" + id, null) > 0;
// task was completed
@ -361,7 +361,7 @@ public class TaskController extends AbstractController {
RepeatInfo repeatInfo = model.getRepeat();
if(repeatInfo != null) {
model.repeatTaskBy(context, this, repeatInfo);
database.update(TASK_TABLE_NAME, values, KEY_ROWID + "=" +
database.update(tasksTable, values, KEY_ROWID + "=" +
task.getTaskIdentifier().getId(), null);
}
@ -398,7 +398,7 @@ public class TaskController extends AbstractController {
cr.delete(Uri.parse(uri), null, null);
ContentValues values = new ContentValues();
values.put(AbstractTaskModel.CALENDAR_URI, (String)null);
database.update(TASK_TABLE_NAME, values, KEY_ROWID + "=" +
database.update(tasksTable, values, KEY_ROWID + "=" +
taskId.getId(), null);
}
} catch (Exception e) {
@ -411,7 +411,7 @@ public class TaskController extends AbstractController {
public boolean setLastNotificationTime(TaskIdentifier taskId, Date date) {
ContentValues values = new ContentValues();
values.put(AbstractTaskModel.LAST_NOTIFIED, date.getTime());
return database.update(TASK_TABLE_NAME, values,
return database.update(tasksTable, values,
KEY_ROWID + "=" + taskId.getId(), null) > 0;
}
@ -485,7 +485,7 @@ public class TaskController extends AbstractController {
/** Returns a TaskModelForView by name */
public TaskModelForSync searchForTaskForSync(String name) throws SQLException {
Cursor cursor = database.query(true, TASK_TABLE_NAME, TaskModelForSync.FIELD_LIST,
Cursor cursor = database.query(true, tasksTable, TaskModelForSync.FIELD_LIST,
AbstractTaskModel.NAME + " = ? AND " +
AbstractTaskModel.PROGRESS_PERCENTAGE + " < "+
AbstractTaskModel.COMPLETE_PERCENTAGE,
@ -514,7 +514,7 @@ public class TaskController extends AbstractController {
* Don't forget to close the cursor when you're done. */
private Cursor fetchTaskCursor(TaskIdentifier taskId, String[] fieldList) {
long id = taskId.getId();
Cursor cursor = database.query(true, TASK_TABLE_NAME, fieldList,
Cursor cursor = database.query(true, tasksTable, fieldList,
KEY_ROWID + "=" + id, null, null, null, null, null);
if (cursor == null)
throw new SQLException("Returned empty set!");
@ -531,7 +531,7 @@ public class TaskController extends AbstractController {
+ AbstractTaskModel.CREATION_DATE + " LIKE ?";
String approximateCreationDate = (creationDate / 1000) + "%";
Cursor cursor = database.query(true, TASK_TABLE_NAME, fieldList,
Cursor cursor = database.query(true, tasksTable, fieldList,
where, new String[] {name, approximateCreationDate}, null, null, null, null);
if (cursor == null)
throw new SQLException("Returned empty set!");
@ -571,7 +571,7 @@ public class TaskController extends AbstractController {
public ArrayList<TaskModelForWidget> getTasksForWidget(String limit) {
Cursor cursor = database.query(TASK_TABLE_NAME, TaskModelForWidget.FIELD_LIST,
Cursor cursor = database.query(tasksTable, TaskModelForWidget.FIELD_LIST,
AbstractTaskModel.PROGRESS_PERCENTAGE + " < " +
AbstractTaskModel.COMPLETE_PERCENTAGE + " AND (" +
AbstractTaskModel.HIDDEN_UNTIL + " ISNULL OR " + AbstractTaskModel.HIDDEN_UNTIL + " < " +
@ -593,7 +593,7 @@ public class TaskController extends AbstractController {
public ArrayList<TaskModelForProvider> getTasksForProvider(String limit) {
Cursor cursor = database.query(TASK_TABLE_NAME, TaskModelForWidget.FIELD_LIST,
Cursor cursor = database.query(tasksTable, TaskModelForWidget.FIELD_LIST,
AbstractTaskModel.PROGRESS_PERCENTAGE + " < " +
AbstractTaskModel.COMPLETE_PERCENTAGE + " AND (" +
AbstractTaskModel.HIDDEN_UNTIL + " ISNULL OR " + AbstractTaskModel.HIDDEN_UNTIL + " < " +
@ -619,8 +619,8 @@ public class TaskController extends AbstractController {
* Constructor - takes the context to allow the database to be
* opened/created
*/
public TaskController(Context activity) {
this.context = activity;
public TaskController(Context context) {
super(context);
}
/**
@ -635,7 +635,7 @@ public class TaskController extends AbstractController {
@Override
public synchronized void open() throws SQLException {
SQLiteOpenHelper databaseHelper = new TaskModelDatabaseHelper(
context, TASK_TABLE_NAME, TASK_TABLE_NAME);
context, tasksTable, tasksTable);
database = databaseHelper.getWritableDatabase();
}

@ -25,7 +25,7 @@ import com.todoroo.astrid.model.Task;
* @author Tim Su <tim@todoroo.com>
*
*/
public final class Database extends AbstractDatabase {
public class Database extends AbstractDatabase {
// --- constants
@ -96,9 +96,8 @@ public final class Database extends AbstractDatabase {
sql.append("CREATE TABLE IF NOT EXISTS ").append(table.name).append('(').
append(AbstractModel.ID_PROPERTY).append(" INTEGER PRIMARY KEY AUTOINCREMENT");
for(Property<?> property : table.getProperties()) {
if(AbstractModel.ID_PROPERTY.equals(property.name))
if(AbstractModel.ID_PROPERTY.name.equals(property.name))
continue;
Log.e("haha", table.name + "'s " + property.name);
sql.append(',').append(property.accept(sqlVisitor, null));
}
sql.append(')');

@ -125,14 +125,14 @@ public class TaskDao extends AbstractDao<Task> {
if (task.getId() == Task.NO_ID) {
task.setValue(Task.CREATION_DATE, DateUtilities.now());
task.setValue(Task.MODIFICATION_DATE, DateUtilities.now());
saveSuccessful = createItem(database, Task.TABLE, task);
saveSuccessful = createItem(database, task);
} else {
ContentValues values = task.getSetValues();
if(values.size() == 0)
return true;
task.setValue(Task.MODIFICATION_DATE, DateUtilities.now());
beforeSave(database, task, values, duringSync);
saveSuccessful = saveItem(database, Task.TABLE, task);
saveSuccessful = saveItem(database, task);
afterSave(database, task, values, duringSync);
}

@ -86,6 +86,13 @@ public class AstridDependencyInjector implements AbstractDependencyInjector {
injectables.put("taskService", TaskService.class);
injectables.put("metadataService", MetadataService.class);
// com.timsu.astrid.data
injectables.put("tasksTable", "tasks");
injectables.put("tagsTable", "tags");
injectables.put("tagTaskTable", "tagTaskMap");
injectables.put("alertsTable", "alerts");
injectables.put("syncTable", "sync");
// these make reference to fields defined above
injectables.put("errorReporters", new ErrorReporter[] {
new AndroidLogReporter(),

@ -17,6 +17,7 @@ import com.todoroo.andlib.data.Property;
import com.todoroo.andlib.data.Property.PropertyVisitor;
import com.todoroo.andlib.service.Autowired;
import com.todoroo.andlib.service.ContextManager;
import com.todoroo.andlib.service.DependencyInjectionService;
import com.todoroo.astrid.dao.Database;
import com.todoroo.astrid.dao.TaskDao;
import com.todoroo.astrid.model.Task;
@ -30,6 +31,15 @@ public final class UpgradeService {
@Autowired
private TaskDao taskDao;
@Autowired
private String tasksTable;
// --- implementation
public UpgradeService() {
DependencyInjectionService.getInstance().inject(this);
}
/**
* Perform upgrade from one version to the next. Needs to be called
* on the UI thread so it can display a progress bar and then
@ -107,7 +117,7 @@ public final class UpgradeService {
propertyMap.put(AbstractTaskModel.COMPLETION_DATE, Task.COMPLETION_DATE);
propertyMap.put(AbstractTaskModel.CALENDAR_URI, Task.CALENDAR_URI);
propertyMap.put(AbstractTaskModel.FLAGS, Task.FLAGS);
upgradeTasksTable(context, AbstractController.TASK_TABLE_NAME,
upgradeTasksTable(context, tasksTable,
propertyMap, new Task(), taskDao);
// --- upgrade tags table
@ -185,7 +195,7 @@ public final class UpgradeService {
AbstractDao<TYPE> dao) {
SQLiteDatabase upgradeDb = new Astrid2UpgradeHelper(context, legacyTable,
null, 0).getReadableDatabase();
null, 1).getReadableDatabase();
Cursor cursor = upgradeDb.rawQuery("SELECT * FROM " + legacyTable, null);
UpgradeVisitorContainer container = new UpgradeVisitorContainer();
@ -198,7 +208,7 @@ public final class UpgradeService {
container.columnIndex = cursor.getColumnIndex(entry.getKey());
entry.getValue().accept(visitor, container);
}
dao.save(database, container.model);
dao.createItem(database, container.model);
}
upgradeDb.close();

@ -22,12 +22,14 @@ package com.todoroo.astrid.legacy.data;
import java.lang.reflect.InvocationTargetException;
import java.util.Iterator;
import com.timsu.astrid.data.AbstractModel;
import android.content.Context;
import android.database.Cursor;
import android.util.Log;
import com.timsu.astrid.data.AbstractModel;
import com.todoroo.andlib.service.Autowired;
import com.todoroo.andlib.service.DependencyInjectionService;
/** Abstract controller class. Mostly contains some static fields */
abstract public class AbstractController {
@ -37,11 +39,27 @@ abstract public class AbstractController {
public static final String KEY_ROWID = "_id";
// database and table names
protected static final String TASK_TABLE_NAME = "tasks";
protected static final String TAG_TABLE_NAME = "tags";
protected static final String TAG_TASK_MAP_NAME = "tagTaskMap";
protected static final String ALERT_TABLE_NAME = "alerts";
protected static final String SYNC_TABLE_NAME = "sync";
@Autowired
protected String tasksTable;
@Autowired
protected String tagsTable;
@Autowired
protected String tagTaskTable;
@Autowired
protected String alertsTable;
@Autowired
protected String syncTable;
// stuff
public AbstractController(Context context) {
this.context = context;
DependencyInjectionService.getInstance().inject(this);
}
abstract public void open();
abstract public void close();

@ -42,7 +42,7 @@ public class AlertController extends AbstractController {
/** Get a cursor to tag identifiers */
public Cursor getTaskAlertsCursor(TaskIdentifier taskId) throws SQLException {
Cursor cursor = alertDatabase.query(ALERT_TABLE_NAME,
Cursor cursor = alertDatabase.query(alertsTable,
Alert.FIELD_LIST, Alert.TASK + " = ?",
new String[] { taskId.idAsString() }, null, null, null);
return cursor;
@ -52,7 +52,7 @@ public class AlertController extends AbstractController {
public List<Date> getTaskAlerts(TaskIdentifier
taskId) throws SQLException {
List<Date> list = new LinkedList<Date>();
Cursor cursor = alertDatabase.query(ALERT_TABLE_NAME,
Cursor cursor = alertDatabase.query(alertsTable,
Alert.FIELD_LIST, Alert.TASK + " = ?",
new String[] { taskId.idAsString() }, null, null, null);
@ -74,7 +74,7 @@ public class AlertController extends AbstractController {
/** Get a list of alerts that are set for the future */
public Set<TaskIdentifier> getTasksWithActiveAlerts() throws SQLException {
Set<TaskIdentifier> list = new HashSet<TaskIdentifier>();
Cursor cursor = alertDatabase.query(ALERT_TABLE_NAME,
Cursor cursor = alertDatabase.query(alertsTable,
Alert.FIELD_LIST, Alert.DATE + " > ?",
new String[] { Long.toString(System.currentTimeMillis()) }, null, null, null);
@ -95,7 +95,7 @@ public class AlertController extends AbstractController {
/** Remove all alerts from the task */
public boolean removeAlerts(TaskIdentifier taskId)
throws SQLException{
return alertDatabase.delete(ALERT_TABLE_NAME,
return alertDatabase.delete(alertsTable,
String.format("%s = ?",
Alert.TASK),
new String[] { taskId.idAsString() }) > 0;
@ -107,7 +107,7 @@ public class AlertController extends AbstractController {
ContentValues values = new ContentValues();
values.put(Alert.DATE, date.getTime());
values.put(Alert.TASK, taskId.getId());
return alertDatabase.insert(ALERT_TABLE_NAME, Alert.TASK,
return alertDatabase.insert(alertsTable, Alert.TASK,
values) >= 0;
}
@ -118,7 +118,7 @@ public class AlertController extends AbstractController {
* opened/created
*/
public AlertController(Context context) {
this.context = context;
super(context);
}
/**
@ -133,7 +133,7 @@ public class AlertController extends AbstractController {
@Override
public void open() throws SQLException {
alertDatabase = new AlertDatabaseHelper(context,
ALERT_TABLE_NAME, ALERT_TABLE_NAME).getWritableDatabase();
alertsTable, alertsTable).getWritableDatabase();
}
/** Closes database resource */

@ -46,7 +46,7 @@ public class SyncDataController extends AbstractController {
public boolean clearUpdatedTaskList(int syncServiceId) throws SQLException {
ContentValues values = new ContentValues();
values.put(SyncMapping.UPDATED, 0);
return syncDatabase.update(SYNC_TABLE_NAME, values,
return syncDatabase.update(syncTable, values,
SyncMapping.SYNC_SERVICE + " = " + syncServiceId, null) > 0;
}
@ -54,7 +54,7 @@ public class SyncDataController extends AbstractController {
public boolean addToUpdatedList(TaskIdentifier taskId) throws SQLException {
ContentValues values = new ContentValues();
values.put(SyncMapping.UPDATED, 1);
return syncDatabase.update(SYNC_TABLE_NAME, values,
return syncDatabase.update(syncTable, values,
SyncMapping.TASK + " = " + taskId.getId(), null) > 0;
}
@ -72,7 +72,7 @@ public class SyncDataController extends AbstractController {
/** Get all mappings for the given synchronization service */
public HashSet<SyncMapping> getSyncMappings(int syncServiceId) throws SQLException {
HashSet<SyncMapping> list = new HashSet<SyncMapping>();
Cursor cursor = syncDatabase.query(SYNC_TABLE_NAME,
Cursor cursor = syncDatabase.query(syncTable,
SyncMapping.FIELD_LIST,
SyncMapping.SYNC_SERVICE + " = " + syncServiceId,
null, null, null, null);
@ -95,7 +95,7 @@ public class SyncDataController extends AbstractController {
public HashSet<SyncMapping> getSyncMappings(TaskIdentifier taskId)
throws SQLException {
HashSet<SyncMapping> list = new HashSet<SyncMapping>();
Cursor cursor = syncDatabase.query(SYNC_TABLE_NAME,
Cursor cursor = syncDatabase.query(syncTable,
SyncMapping.FIELD_LIST,
SyncMapping.TASK + " = ?",
new String[] { "" + taskId.getId() },
@ -118,7 +118,7 @@ public class SyncDataController extends AbstractController {
/** Get mapping for given task */
public SyncMapping getSyncMapping(int syncServiceId, TaskIdentifier taskId)
throws SQLException {
Cursor cursor = syncDatabase.query(SYNC_TABLE_NAME,
Cursor cursor = syncDatabase.query(syncTable,
SyncMapping.FIELD_LIST,
SyncMapping.SYNC_SERVICE + " = ? AND " +
SyncMapping.TASK + " = ?",
@ -137,7 +137,7 @@ public class SyncDataController extends AbstractController {
/** Saves the given task to the database. Returns true on success. */
public boolean saveSyncMapping(SyncMapping mapping) {
long newRow = syncDatabase.insert(SYNC_TABLE_NAME, SyncMapping.TASK,
long newRow = syncDatabase.insert(syncTable, SyncMapping.TASK,
mapping.getMergedValues());
mapping.setId(newRow);
@ -151,13 +151,13 @@ public class SyncDataController extends AbstractController {
if(mapping.getId() == 0)
return false;
return syncDatabase.delete(SYNC_TABLE_NAME, KEY_ROWID + "=" +
return syncDatabase.delete(syncTable, KEY_ROWID + "=" +
mapping.getId(), null) > 0;
}
/** Deletes the given mapping. Returns true on success */
public boolean deleteAllMappings(int syncServiceId) {
return syncDatabase.delete(SYNC_TABLE_NAME, SyncMapping.SYNC_SERVICE +
return syncDatabase.delete(syncTable, SyncMapping.SYNC_SERVICE +
"=" + syncServiceId, null) > 0;
}
@ -168,7 +168,7 @@ public class SyncDataController extends AbstractController {
* opened/created
*/
public SyncDataController(Context context) {
this.context = context;
super(context);
}
/**
@ -183,7 +183,7 @@ public class SyncDataController extends AbstractController {
@Override
public synchronized void open() throws SQLException {
SQLiteOpenHelper helper = new SyncMappingDatabaseHelper(context,
SYNC_TABLE_NAME, SYNC_TABLE_NAME);
syncTable, syncTable);
syncDatabase = helper.getWritableDatabase();
}

@ -47,7 +47,7 @@ public class TagController extends AbstractController {
public LinkedList<TagModelForView> getAllTags()
throws SQLException {
LinkedList<TagModelForView> list = new LinkedList<TagModelForView>();
Cursor cursor = tagDatabase.query(TAG_TABLE_NAME,
Cursor cursor = tagDatabase.query(tagsTable,
TagModelForView.FIELD_LIST, null, null, null, null, null, null);
try {
@ -78,7 +78,7 @@ public class TagController extends AbstractController {
public LinkedList<TagIdentifier> getTaskTags(TaskIdentifier
taskId) throws SQLException {
LinkedList<TagIdentifier> list = new LinkedList<TagIdentifier>();
Cursor cursor = tagToTaskMapDatabase.query(TAG_TASK_MAP_NAME,
Cursor cursor = tagToTaskMapDatabase.query(tagTaskTable,
TagToTaskMapping.FIELD_LIST, TagToTaskMapping.TASK + " = ?",
new String[] { taskId.idAsString() }, null, null, null);
@ -102,7 +102,7 @@ public class TagController extends AbstractController {
public LinkedList<TaskIdentifier> getTaggedTasks(TagIdentifier tagId)
throws SQLException {
LinkedList<TaskIdentifier> list = new LinkedList<TaskIdentifier>();
Cursor cursor = tagToTaskMapDatabase.query(TAG_TASK_MAP_NAME,
Cursor cursor = tagToTaskMapDatabase.query(tagTaskTable,
TagToTaskMapping.FIELD_LIST, TagToTaskMapping.TAG + " = ?",
new String[] { tagId.idAsString() }, null, null, null);
@ -132,14 +132,14 @@ public class TagController extends AbstractController {
HashSet<Long> ids = new HashSet<Long>();
String[] tagMapColumns = new String[] { TagToTaskMapping.TASK };
Cursor tagMapCursor = tagToTaskMapDatabase.query(TAG_TASK_MAP_NAME,
Cursor tagMapCursor = tagToTaskMapDatabase.query(tagTaskTable,
tagMapColumns, null, null, TagToTaskMapping.TASK, null,
TagToTaskMapping.TASK + " ASC");
SQLiteDatabase taskDatabase = new TaskModelDatabaseHelper(context,
TASK_TABLE_NAME, TASK_TABLE_NAME).getReadableDatabase();
tasksTable, tasksTable).getReadableDatabase();
String[] taskColumns = new String[] { KEY_ROWID };
Cursor taskCursor = taskDatabase.query(TASK_TABLE_NAME, taskColumns,
Cursor taskCursor = taskDatabase.query(tasksTable, taskColumns,
null, null, null, null, KEY_ROWID + " ASC");
LinkedList<TaskIdentifier> list = new LinkedList<TaskIdentifier>();
@ -177,7 +177,7 @@ public class TagController extends AbstractController {
throw new NullPointerException("Name can't be null");
TagModelForView newTag = new TagModelForView(name);
long row = tagDatabase.insertOrThrow(TAG_TABLE_NAME, AbstractTagModel.NAME,
long row = tagDatabase.insertOrThrow(tagsTable, AbstractTagModel.NAME,
newTag.getMergedValues());
return new TagIdentifier(row);
}
@ -187,14 +187,14 @@ public class TagController extends AbstractController {
boolean saveSucessful;
if(tag.getTagIdentifier() == null) {
long newRow = tagDatabase.insert(TAG_TABLE_NAME, AbstractTagModel.NAME,
long newRow = tagDatabase.insert(tagsTable, AbstractTagModel.NAME,
tag.getMergedValues());
tag.setTagIdentifier(new TagIdentifier(newRow));
saveSucessful = newRow >= 0;
} else {
long id = tag.getTagIdentifier().getId();
saveSucessful = tagDatabase.update(TAG_TABLE_NAME, tag.getSetValues(),
saveSucessful = tagDatabase.update(tagsTable, tag.getSetValues(),
KEY_ROWID + "=" + id, null) > 0;
}
@ -203,7 +203,7 @@ public class TagController extends AbstractController {
/** Returns a TaskModelForView corresponding to the given Tag Name */
public TagModelForView fetchTagFromName(String name) throws SQLException {
Cursor cursor = tagDatabase.query(true, TAG_TABLE_NAME,
Cursor cursor = tagDatabase.query(true, tagsTable,
TagModelForView.FIELD_LIST,
AbstractTagModel.NAME + " = ?", new String[] {name}, null, null, null, null);
@ -223,7 +223,7 @@ public class TagController extends AbstractController {
/** Returns a TaskModelForView corresponding to the given TagIdentifier */
public TagModelForView fetchTagForView(TagIdentifier tagId) throws SQLException {
long id = tagId.getId();
Cursor cursor = tagDatabase.query(true, TAG_TABLE_NAME,
Cursor cursor = tagDatabase.query(true, tagsTable,
TagModelForView.FIELD_LIST,
KEY_ROWID + "=" + id, null, null, null, null, null);
@ -244,11 +244,11 @@ public class TagController extends AbstractController {
/** Deletes the tag and removes tag/task mappings */
public boolean deleteTag( TagIdentifier tagId)
throws SQLException{
if(tagToTaskMapDatabase.delete(TAG_TASK_MAP_NAME,
if(tagToTaskMapDatabase.delete(tagTaskTable,
TagToTaskMapping.TAG + " = " + tagId.idAsString(), null) < 0)
return false;
int res = tagDatabase.delete(TAG_TABLE_NAME,
int res = tagDatabase.delete(tagsTable,
KEY_ROWID + " = " + tagId.idAsString(), null);
return res > 0;
@ -260,7 +260,7 @@ public class TagController extends AbstractController {
public boolean removeTag(TaskIdentifier taskId, TagIdentifier tagId)
throws SQLException{
int res = tagToTaskMapDatabase.delete(TAG_TASK_MAP_NAME,
int res = tagToTaskMapDatabase.delete(tagTaskTable,
String.format("%s = ? AND %s = ?",
TagToTaskMapping.TAG, TagToTaskMapping.TASK),
new String[] { tagId.idAsString(), taskId.idAsString() });
@ -278,7 +278,7 @@ public class TagController extends AbstractController {
values.put(TagToTaskMapping.TAG, tagId.getId());
values.put(TagToTaskMapping.TASK, taskId.getId());
long res = tagToTaskMapDatabase.insert(TAG_TASK_MAP_NAME, TagToTaskMapping.TAG,
long res = tagToTaskMapDatabase.insert(tagTaskTable, TagToTaskMapping.TAG,
values);
return res >= 0;
@ -291,7 +291,7 @@ public class TagController extends AbstractController {
* opened/created
*/
public TagController(Context context) {
this.context = context;
super(context);
}
/**
@ -306,9 +306,9 @@ public class TagController extends AbstractController {
@Override
public synchronized void open() throws SQLException {
tagToTaskMapDatabase = new TagToTaskMappingDatabaseHelper(context,
TAG_TASK_MAP_NAME, TAG_TASK_MAP_NAME).getWritableDatabase();
tagTaskTable, tagTaskTable).getWritableDatabase();
tagDatabase = new TagModelDatabaseHelper(context,
TAG_TABLE_NAME, TAG_TABLE_NAME).getWritableDatabase();
tagsTable, tagsTable).getWritableDatabase();
}
/** Closes database resource */

@ -55,7 +55,7 @@ public class TaskController extends AbstractController {
/** Return a list of all active tasks with notifications */
public HashSet<TaskModelForNotify> getTasksWithNotifications() {
HashSet<TaskModelForNotify> list = new HashSet<TaskModelForNotify>();
Cursor cursor = database.query(TASK_TABLE_NAME, TaskModelForNotify.FIELD_LIST,
Cursor cursor = database.query(tasksTable, TaskModelForNotify.FIELD_LIST,
String.format("%s < %d AND (%s != 0 OR %s != 0)",
AbstractTaskModel.PROGRESS_PERCENTAGE,
AbstractTaskModel.COMPLETE_PERCENTAGE,
@ -79,7 +79,7 @@ public class TaskController extends AbstractController {
/** Return a list of all active tasks with deadlines */
public ArrayList<TaskModelForNotify> getTasksWithDeadlines() {
ArrayList<TaskModelForNotify> list = new ArrayList<TaskModelForNotify>();
Cursor cursor = database.query(TASK_TABLE_NAME, TaskModelForNotify.FIELD_LIST,
Cursor cursor = database.query(tasksTable, TaskModelForNotify.FIELD_LIST,
String.format("%s < %d AND (%s != 0 OR %s != 0)",
AbstractTaskModel.PROGRESS_PERCENTAGE,
AbstractTaskModel.COMPLETE_PERCENTAGE,
@ -103,7 +103,7 @@ public class TaskController extends AbstractController {
/** Return a list of all of the tasks with progress < COMPLETE_PERCENTAGE */
public Cursor getActiveTaskListCursor() {
return database.query(TASK_TABLE_NAME, TaskModelForList.FIELD_LIST,
return database.query(tasksTable, TaskModelForList.FIELD_LIST,
AbstractTaskModel.PROGRESS_PERCENTAGE + " < " +
AbstractTaskModel.COMPLETE_PERCENTAGE, null, null, null,
null, null);
@ -111,13 +111,13 @@ public class TaskController extends AbstractController {
/** Return a list of all tasks */
public Cursor getAllTaskListCursor() {
return database.query(TASK_TABLE_NAME, TaskModelForList.FIELD_LIST,
return database.query(tasksTable, TaskModelForList.FIELD_LIST,
null, null, null, null, null, null);
}
/** Return a list of all tasks */
public Cursor getBackupTaskListCursor() {
return database.query(TASK_TABLE_NAME, TaskModelForXml.FIELD_LIST,
return database.query(tasksTable, TaskModelForXml.FIELD_LIST,
AbstractTaskModel.PROGRESS_PERCENTAGE + " < " +
AbstractTaskModel.COMPLETE_PERCENTAGE, null, null, null,
null, null);
@ -125,7 +125,7 @@ public class TaskController extends AbstractController {
/** Delete all completed tasks with date < older than date */
public int deleteCompletedTasksOlderThan(Date olderThanDate) {
return database.delete(TASK_TABLE_NAME, String.format("`%s` >= '%d' AND `%s` <= '%d'",
return database.delete(tasksTable, String.format("`%s` >= '%d' AND `%s` <= '%d'",
AbstractTaskModel.PROGRESS_PERCENTAGE, AbstractTaskModel.COMPLETE_PERCENTAGE,
AbstractTaskModel.COMPLETION_DATE, olderThanDate.getTime()), null);
}
@ -167,14 +167,14 @@ public class TaskController extends AbstractController {
/** Get identifiers for all tasks */
public HashSet<TaskIdentifier> getAllTaskIdentifiers() {
Cursor cursor = database.query(TASK_TABLE_NAME, new String[] { KEY_ROWID },
Cursor cursor = database.query(tasksTable, new String[] { KEY_ROWID },
null, null, null, null, null, null);
return createTaskIdentifierSet(cursor);
}
/** Get identifiers for all non-completed tasks */
public HashSet<TaskIdentifier> getActiveTaskIdentifiers() {
Cursor cursor = database.query(TASK_TABLE_NAME, new String[] { KEY_ROWID },
Cursor cursor = database.query(tasksTable, new String[] { KEY_ROWID },
AbstractTaskModel.PROGRESS_PERCENTAGE + " < " +
AbstractTaskModel.COMPLETE_PERCENTAGE, null, null, null, null, null);
return createTaskIdentifierSet(cursor);
@ -182,7 +182,7 @@ public class TaskController extends AbstractController {
/** Get identifiers for all non-completed, non-hidden tasks */
public HashSet<TaskIdentifier> getActiveVisibleTaskIdentifiers() {
Cursor cursor = database.query(TASK_TABLE_NAME, new String[] { KEY_ROWID },
Cursor cursor = database.query(tasksTable, new String[] { KEY_ROWID },
AbstractTaskModel.PROGRESS_PERCENTAGE + " < " +
AbstractTaskModel.COMPLETE_PERCENTAGE + " AND (" +
AbstractTaskModel.HIDDEN_UNTIL + " ISNULL OR " + AbstractTaskModel.HIDDEN_UNTIL + " < " +
@ -207,7 +207,7 @@ public class TaskController extends AbstractController {
if(idList.size() == 0)
where.append("0");
return database.query(true, TASK_TABLE_NAME,
return database.query(true, tasksTable,
TaskModelForList.FIELD_LIST, where.toString(), null, null,
null, null, null);
}
@ -221,7 +221,7 @@ public class TaskController extends AbstractController {
long id = taskId.getId();
cleanupTask(taskId, false);
return database.delete(TASK_TABLE_NAME, KEY_ROWID + "=" + id, null) > 0;
return database.delete(tasksTable, KEY_ROWID + "=" + id, null) > 0;
}
/** Saves the given task to the database. Returns true on success.
@ -232,7 +232,7 @@ public class TaskController extends AbstractController {
boolean saveSucessful;
if(task.getTaskIdentifier() == null) {
long newRow = database.insert(TASK_TABLE_NAME, AbstractTaskModel.NAME,
long newRow = database.insert(tasksTable, AbstractTaskModel.NAME,
task.getMergedValues());
task.setTaskIdentifier(new TaskIdentifier(newRow));
@ -246,7 +246,7 @@ public class TaskController extends AbstractController {
onTaskSave(task, values, duringSync);
saveSucessful = database.update(TASK_TABLE_NAME, values,
saveSucessful = database.update(tasksTable, values,
KEY_ROWID + "=" + id, null) > 0;
// task was completed
@ -293,7 +293,7 @@ public class TaskController extends AbstractController {
RepeatInfo repeatInfo = model.getRepeat();
if(repeatInfo != null) {
model.repeatTaskBy(context, this, repeatInfo);
database.update(TASK_TABLE_NAME, values, KEY_ROWID + "=" +
database.update(tasksTable, values, KEY_ROWID + "=" +
task.getTaskIdentifier().getId(), null);
}
@ -316,7 +316,7 @@ public class TaskController extends AbstractController {
cr.delete(Uri.parse(uri), null, null);
ContentValues values = new ContentValues();
values.put(AbstractTaskModel.CALENDAR_URI, (String)null);
database.update(TASK_TABLE_NAME, values, KEY_ROWID + "=" +
database.update(tasksTable, values, KEY_ROWID + "=" +
taskId.getId(), null);
}
} catch (Exception e) {
@ -329,7 +329,7 @@ public class TaskController extends AbstractController {
public boolean setLastNotificationTime(TaskIdentifier taskId, Date date) {
ContentValues values = new ContentValues();
values.put(AbstractTaskModel.LAST_NOTIFIED, date.getTime());
return database.update(TASK_TABLE_NAME, values,
return database.update(tasksTable, values,
KEY_ROWID + "=" + taskId.getId(), null) > 0;
}
@ -403,7 +403,7 @@ public class TaskController extends AbstractController {
/** Returns a TaskModelForView by name */
public TaskModelForSync searchForTaskForSync(String name) throws SQLException {
Cursor cursor = database.query(true, TASK_TABLE_NAME, TaskModelForSync.FIELD_LIST,
Cursor cursor = database.query(true, tasksTable, TaskModelForSync.FIELD_LIST,
AbstractTaskModel.NAME + " = ? AND " +
AbstractTaskModel.PROGRESS_PERCENTAGE + " < "+
AbstractTaskModel.COMPLETE_PERCENTAGE,
@ -432,7 +432,7 @@ public class TaskController extends AbstractController {
* Don't forget to close the cursor when you're done. */
private Cursor fetchTaskCursor(TaskIdentifier taskId, String[] fieldList) {
long id = taskId.getId();
Cursor cursor = database.query(true, TASK_TABLE_NAME, fieldList,
Cursor cursor = database.query(true, tasksTable, fieldList,
KEY_ROWID + "=" + id, null, null, null, null, null);
if (cursor == null)
throw new SQLException("Returned empty set!");
@ -449,7 +449,7 @@ public class TaskController extends AbstractController {
+ AbstractTaskModel.CREATION_DATE + " LIKE ?";
String approximateCreationDate = (creationDate / 1000) + "%";
Cursor cursor = database.query(true, TASK_TABLE_NAME, fieldList,
Cursor cursor = database.query(true, tasksTable, fieldList,
where, new String[] {name, approximateCreationDate}, null, null, null, null);
if (cursor == null)
throw new SQLException("Returned empty set!");
@ -480,7 +480,7 @@ public class TaskController extends AbstractController {
public ArrayList<TaskModelForWidget> getTasksForWidget(String limit) {
Cursor cursor = database.query(TASK_TABLE_NAME, TaskModelForWidget.FIELD_LIST,
Cursor cursor = database.query(tasksTable, TaskModelForWidget.FIELD_LIST,
AbstractTaskModel.PROGRESS_PERCENTAGE + " < " +
AbstractTaskModel.COMPLETE_PERCENTAGE + " AND (" +
AbstractTaskModel.HIDDEN_UNTIL + " ISNULL OR " + AbstractTaskModel.HIDDEN_UNTIL + " < " +
@ -502,7 +502,7 @@ public class TaskController extends AbstractController {
public ArrayList<TaskModelForProvider> getTasksForProvider(String limit) {
Cursor cursor = database.query(TASK_TABLE_NAME, TaskModelForWidget.FIELD_LIST,
Cursor cursor = database.query(tasksTable, TaskModelForWidget.FIELD_LIST,
AbstractTaskModel.PROGRESS_PERCENTAGE + " < " +
AbstractTaskModel.COMPLETE_PERCENTAGE + " AND (" +
AbstractTaskModel.HIDDEN_UNTIL + " ISNULL OR " + AbstractTaskModel.HIDDEN_UNTIL + " < " +
@ -529,7 +529,7 @@ public class TaskController extends AbstractController {
* opened/created
*/
public TaskController(Context activity) {
this.context = activity;
super(activity);
}
/**
@ -544,7 +544,7 @@ public class TaskController extends AbstractController {
@Override
public synchronized void open() throws SQLException {
SQLiteOpenHelper databaseHelper = new TaskModelDatabaseHelper(
context, TASK_TABLE_NAME, TASK_TABLE_NAME);
context, tasksTable, tasksTable);
database = databaseHelper.getWritableDatabase();
}

@ -1,425 +0,0 @@
package com.todoroo.astrid.provider;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import com.todoroo.astrid.api.AstridContentProvider;
import com.todoroo.astrid.api.AstridContentProvider.AstridTask;
import com.todoroo.astrid.test.DatabaseTestCase;
public class ProviderTests extends DatabaseTestCase {
String[] PROJECTION = new String[] {
AstridTask.ID,
AstridTask.TITLE,
};
/** Test CRUD over tasks with the ALL ITEMS cursor */
public void testAllItemsCrud() {
ContentResolver resolver = getContext().getContentResolver();
// fetch all tasks, get nothing
Uri uri = AstridContentProvider.allItemsUri();
Cursor cursor = resolver.query(uri, PROJECTION, "1", null, null);
assertEquals(0, cursor.getCount());
cursor.close();
// insert a task
ContentValues values = new ContentValues();
values.put(AstridTask.TITLE, "mf doom?");
resolver.insert(uri, values);
// fetch all tasks, get something
cursor = resolver.query(uri, PROJECTION, "1", null, null);
assertEquals(1, cursor.getCount());
cursor.moveToFirst();
assertEquals("mf doom?", cursor.getString(1));
cursor.close();
// delete a task
assertEquals(1, resolver.delete(uri, "1", null));
// fetch all tasks, get nothing
cursor = resolver.query(uri, PROJECTION, null, null, null);
assertEquals(0, cursor.getCount());
cursor.close();
}
/** Test selecting data */
public void testSelection() {
ContentResolver resolver = getContext().getContentResolver();
Uri uri = AstridContentProvider.allItemsUri();
// insert some tasks
ContentValues values = new ContentValues();
values.put(AstridTask.TITLE, "tujiko noriko");
values.put(AstridTask.IMPORTANCE, AstridTask.IMPORTANCE_MUST_DO);
resolver.insert(uri, values);
values.clear();
values.put(AstridTask.TITLE, "miho asahi");
values.put(AstridTask.IMPORTANCE, AstridTask.IMPORTANCE_NONE);
resolver.insert(uri, values);
// fetch all tasks with various selection parameters
Cursor cursor = resolver.query(uri, PROJECTION, "1", null, null);
assertEquals(2, cursor.getCount());
cursor.close();
cursor = resolver.query(uri, PROJECTION, null, null, null);
assertEquals(2, cursor.getCount());
cursor.close();
cursor = resolver.query(uri, PROJECTION, AstridTask.IMPORTANCE + "=" +
AstridTask.IMPORTANCE_MUST_DO, null, null);
assertEquals(1, cursor.getCount());
cursor.moveToFirst();
assertEquals("tujiko noriko", cursor.getString(1));
cursor.close();
cursor = resolver.query(uri, PROJECTION, AstridTask.IMPORTANCE + "<" +
AstridTask.IMPORTANCE_MUST_DO, null, null);
assertEquals(1, cursor.getCount());
cursor.moveToFirst();
assertEquals("miho asahi", cursor.getString(1));
cursor.close();
cursor = resolver.query(uri, PROJECTION, AstridTask.IMPORTANCE + "=" +
AstridTask.IMPORTANCE_DO_OR_DIE, null, null);
assertEquals(0, cursor.getCount());
cursor.close();
}
/** Test selecting data with metadata */
public void testSelectionWithMetadata() {
ContentResolver resolver = getContext().getContentResolver();
Uri uri = AstridContentProvider.allItemsUri();
// insert some tasks
ContentValues values = new ContentValues();
values.put(AstridTask.TITLE, "turkoglu");
values.put("suave-factor", "10");
resolver.insert(uri, values);
values.clear();
values.put(AstridTask.TITLE, "ichiro");
values.put("suave-factor", "30");
resolver.insert(uri, values);
values.clear();
values.put(AstridTask.TITLE, "oprah");
values.put("suave-factor", "-10");
resolver.insert(uri, values);
values.clear();
values.put(AstridTask.TITLE, "cruise");
values.put("suave-factor", "-10");
resolver.insert(uri, values);
values.clear();
values.put(AstridTask.TITLE, "oprah");
resolver.insert(uri, values);
String[] projection = new String[] {
AstridTask.ID,
AstridTask.TITLE,
"suave-factor"
};
// fetch all tasks with various selection parameters
Cursor cursor = resolver.query(uri, projection, "1", null, null);
assertEquals(3, cursor.getCount());
cursor.close();
cursor = resolver.query(uri, projection, "'suave-factor' = 30", null, null);
assertEquals(1, cursor.getCount());
cursor.moveToFirst();
assertEquals("ichiro", cursor.getString(1));
cursor.close();
cursor = resolver.query(uri, projection, "'suave-factor' < 5", null, null);
assertEquals(1, cursor.getCount());
cursor.moveToFirst();
assertEquals("cruise", cursor.getString(1));
cursor.close();
cursor = resolver.query(uri, projection, "'suave-factor' ISNULL", null, null);
assertEquals(1, cursor.getCount());
cursor.moveToFirst();
assertEquals("oprah", cursor.getString(1));
cursor.close();
}
/** Test updating */
public void testUpdating() {
ContentResolver resolver = getContext().getContentResolver();
Uri allItemsUri = AstridContentProvider.allItemsUri();
// insert some tasks
ContentValues values = new ContentValues();
values.put(AstridTask.TITLE, "carlos silva");
values.put("suckitude", "acute");
Uri carlosUri = resolver.insert(allItemsUri, values);
values.clear();
values.put(AstridTask.TITLE, "felix hernandez");
values.put(AstridTask.URGENCY, AstridTask.URGENCY_WITHIN_A_YEAR);
resolver.insert(allItemsUri, values);
String[] projection = new String[] {
AstridTask.ID,
AstridTask.TITLE,
"suckitude"
};
// test updating with single item URI
Cursor cursor = resolver.query(allItemsUri, projection, "'suckitude' = 'carlos who?'", null, null);
assertEquals(0, cursor.getCount());
cursor.close();
values.clear();
values.put("suckitude", "carlos who?");
assertEquals(1, resolver.update(carlosUri, values, null, null));
cursor = resolver.query(allItemsUri, projection, "'suckitude' = 'carlos who?'", null, null);
assertEquals(1, cursor.getCount());
cursor.close();
// test updating with all items uri
cursor = resolver.query(allItemsUri, PROJECTION, AstridTask.URGENCY + " = " +
AstridTask.URGENCY_NONE, null, null);
assertEquals(0, cursor.getCount());
cursor.close();
values.clear();
values.put(AstridTask.URGENCY, AstridTask.URGENCY_NONE);
assertEquals(1, resolver.update(allItemsUri, values, AstridTask.URGENCY +
"=" + AstridTask.URGENCY_WITHIN_A_YEAR, null));
cursor = resolver.query(allItemsUri, PROJECTION, AstridTask.URGENCY + " = " +
AstridTask.URGENCY_NONE, null, null);
assertEquals(1, cursor.getCount());
cursor.close();
// test updating with group by uri
try {
Uri groupByUri = AstridContentProvider.groupByUri(AstridTask.TITLE);
resolver.update(groupByUri, values, null, null);
fail("Able to update using groupby uri");
} catch (Exception e) {
// expected
}
}
/** Test deleting */
public void testDeleting() {
ContentResolver resolver = getContext().getContentResolver();
Uri allItemsUri = AstridContentProvider.allItemsUri();
// insert some tasks
ContentValues values = new ContentValues();
values.put(AstridTask.TITLE, "modest mouse");
values.put(AstridTask.IMPORTANCE, AstridTask.IMPORTANCE_DO_OR_DIE);
Uri modestMouse = resolver.insert(allItemsUri, values);
values.clear();
values.put(AstridTask.TITLE, "death cab");
values.put(AstridTask.IMPORTANCE, AstridTask.IMPORTANCE_MUST_DO);
resolver.insert(allItemsUri, values);
values.clear();
values.put(AstridTask.TITLE, "murder city devils");
values.put(AstridTask.IMPORTANCE, AstridTask.IMPORTANCE_SHOULD_DO);
resolver.insert(allItemsUri, values);
// test deleting with single URI
Cursor cursor = resolver.query(allItemsUri, PROJECTION, AstridTask.TITLE +
" = 'modest mouse'", null, null);
assertEquals(1, cursor.getCount());
cursor.close();
assertEquals(1, resolver.delete(modestMouse, null, null));
cursor = resolver.query(allItemsUri, PROJECTION, AstridTask.TITLE +
" = 'modest mouse'", null, null);
assertEquals(0, cursor.getCount());
cursor.close();
// test updating with all items uri
cursor = resolver.query(allItemsUri, PROJECTION, AstridTask.TITLE +
" = 'murder city devils'", null, null);
assertEquals(1, cursor.getCount());
cursor.close();
assertEquals(1, resolver.delete(allItemsUri, AstridTask.IMPORTANCE +
"<" + AstridTask.IMPORTANCE_MUST_DO, null));
cursor = resolver.query(allItemsUri, PROJECTION, AstridTask.TITLE +
" = 'murder city devils'", null, null);
assertEquals(0, cursor.getCount());
cursor.close();
// test with group by uri
try {
Uri groupByUri = AstridContentProvider.groupByUri(AstridTask.TITLE);
resolver.delete(groupByUri, null, null);
fail("Able to delete using groupby uri");
} catch (Exception e) {
// expected
}
}
/** Test CRUD over SINGLE ITEM uri */
public void testSingleItemCrud() {
ContentResolver resolver = getContext().getContentResolver();
Uri uri = AstridContentProvider.allItemsUri();
ContentValues values = new ContentValues();
values.put(AstridTask.TITLE, "mf doom?");
Uri firstUri = resolver.insert(uri, values);
values.put(AstridTask.TITLE, "gm grimm!");
Uri secondUri = resolver.insert(uri, values);
assertNotSame(firstUri, secondUri);
Cursor cursor = resolver.query(uri, PROJECTION, "1", null, null);
assertEquals(2, cursor.getCount());
cursor.close();
cursor = resolver.query(firstUri, PROJECTION, null, null, null);
assertEquals(1, cursor.getCount());
cursor.moveToFirst();
assertEquals("mf doom?", cursor.getString(1));
cursor.close();
values.put(AstridTask.TITLE, "danger mouse.");
resolver.update(firstUri, values, null, null);
cursor = resolver.query(firstUri, PROJECTION, null, null, null);
assertEquals(1, cursor.getCount());
cursor.moveToFirst();
assertEquals("danger mouse.", cursor.getString(1));
cursor.close();
assertEquals(1, resolver.delete(firstUri, null, null));
cursor = resolver.query(uri, PROJECTION, null, null, null);
assertEquals(1, cursor.getCount());
cursor.close();
}
/** Test GROUP BY uri */
public void testGroupByCrud() {
ContentResolver resolver = getContext().getContentResolver();
Uri uri = AstridContentProvider.allItemsUri();
ContentValues values = new ContentValues();
values.put(AstridTask.TITLE, "catwoman");
resolver.insert(uri, values);
values.put(AstridTask.TITLE, "the joker");
resolver.insert(uri, values);
resolver.insert(uri, values);
resolver.insert(uri, values);
values.put(AstridTask.TITLE, "deep freeze");
resolver.insert(uri, values);
resolver.insert(uri, values);
Uri groupByUri = AstridContentProvider.groupByUri(AstridTask.TITLE);
Cursor cursor = resolver.query(groupByUri, PROJECTION, null, null, AstridTask.TITLE);
assertEquals(3, cursor.getCount());
cursor.moveToFirst();
assertEquals("catwoman", cursor.getString(1));
cursor.moveToNext();
assertEquals("deep freeze", cursor.getString(1));
cursor.moveToNext();
assertEquals("the joker", cursor.getString(1));
cursor.close();
// test "group-by" with metadata
values.put("age", 50);
values.put("size", "large");
resolver.insert(uri, values);
values.put("age", 40);
values.put("size", "large");
resolver.insert(uri, values);
values.put("age", 20);
values.put("size", "small");
resolver.insert(uri, values);
Uri groupByAgeUri = AstridContentProvider.groupByUri("size");
cursor = resolver.query(groupByUri, PROJECTION, null, null, AstridTask.TITLE);
assertEquals(3, cursor.getCount());
}
/** Test updating and deleting with metadata */
public void testMetadataUpdateDelete() {
ContentResolver resolver = getContext().getContentResolver();
Uri allItemsUri = AstridContentProvider.allItemsUri();
// insert some tasks
ContentValues values = new ContentValues();
values.put(AstridTask.TITLE, "chicago");
values.put("pizza", "delicious");
values.put("temperature", 20);
resolver.insert(allItemsUri, values);
values.clear();
values.put(AstridTask.TITLE, "san francisco");
values.put("pizza", "meh");
values.put("temperature", 60);
resolver.insert(allItemsUri, values);
values.clear();
values.put(AstridTask.TITLE, "new york");
values.put("pizza", "yum");
values.put("temperature", 30);
resolver.insert(allItemsUri, values);
// test updating with standard URI (shouldn't work)
values.clear();
values.put("pizza", "nonexistent, the city is underwater");
assertEquals(0, resolver.update(allItemsUri, values,
"'pizza'='yum'", null));
String[] projection = new String[] {
AstridTask.ID,
AstridTask.TITLE,
"pizza",
"temperature"
};
Cursor cursor = resolver.query(allItemsUri, projection, "'pizza' = 'yum'", null, null);
assertEquals(1, cursor.getCount());
cursor.close();
// test updating with metadata uri
Uri pizzaUri = AstridContentProvider.allItemsWithMetadataUri(new String[] {"pizza"});
assertEquals(1, resolver.update(pizzaUri, values,
"'pizza'='yum'", null));
cursor = resolver.query(allItemsUri, projection, "'pizza' = 'yum'", null, null);
assertEquals(0, cursor.getCount());
cursor.close();
// test deleting with metadata uri
Uri pizzaTempUri = AstridContentProvider.allItemsWithMetadataUri(new String[] {"pizza",
"temperature"});
cursor = resolver.query(allItemsUri, projection, AstridTask.TITLE + " = 'chicago'", null, null);
assertEquals(0, cursor.getCount());
cursor.close();
// SQLITE: the deliverer of BAD NEWS
assertEquals(0, resolver.delete(pizzaTempUri, "pizza='delicious' AND temperature > 50", null));
assertEquals(1, resolver.delete(pizzaTempUri, "pizza='delicious' AND temperature < 50", null));
cursor = resolver.query(allItemsUri, projection, AstridTask.TITLE + " = 'chicago'", null, null);
assertEquals(0, cursor.getCount());
cursor.close();
}
}

@ -1,6 +1,7 @@
package com.todoroo.astrid.test;
import com.todoroo.andlib.service.Autowired;
import com.todoroo.andlib.service.TestDependencyInjector;
import com.todoroo.andlib.test.TodorooTestCase;
import com.todoroo.astrid.dao.Database;
import com.todoroo.astrid.service.AstridDependencyInjector;
@ -13,11 +14,24 @@ import com.todoroo.astrid.service.AstridDependencyInjector;
*/
public class DatabaseTestCase extends TodorooTestCase {
private static final String SYNC_TEST = "synctest";
private static final String ALERTS_TEST = "alertstest";
private static final String TAG_TASK_TEST = "tagtasktest";
private static final String TAGS_TEST = "tagstest";
private static final String TASKS_TEST = "taskstest";
@Autowired
public Database database;
static {
AstridDependencyInjector.initialize();
TestDependencyInjector injector = TestDependencyInjector.initialize("db");
injector.addInjectable("tasksTable", TASKS_TEST);
injector.addInjectable("tagsTable", TAGS_TEST);
injector.addInjectable("tagTaskTable", TAG_TASK_TEST);
injector.addInjectable("alertsTable", ALERTS_TEST);
injector.addInjectable("syncTable", SYNC_TEST);
injector.addInjectable("database", new TestDatabase());
}
@Override
@ -27,10 +41,26 @@ public class DatabaseTestCase extends TodorooTestCase {
// create new test database
database.clear();
database.openForWriting();
// clear legacy databases
getContext().deleteDatabase(TASKS_TEST);
getContext().deleteDatabase(TAGS_TEST);
getContext().deleteDatabase(TAG_TASK_TEST);
getContext().deleteDatabase(ALERTS_TEST);
getContext().deleteDatabase(SYNC_TEST);
}
@Override
protected void tearDown() throws Exception {
database.close();
}
public static class TestDatabase extends Database {
private static final String NAME = "databasetest";
@Override
protected String getName() {
return NAME;
}
}
}

@ -30,14 +30,27 @@ public class Astrid2To3UpgradeTests extends DatabaseTestCase {
assertEquals(old.getTime() / 1000L, newDate);
}
public void testBasicUpgrades() {
public void xtestEmptyUpgrade() {
TaskController taskController = new TaskController(getContext());
taskController.open();
assertEquals(0, taskController.getAllTaskIdentifiers().size());
// upgrade
taskController.close();
upgrade2To3();
TodorooCursor<Task> tasks = taskDao.query(database, Query.select(Task.PROPERTIES));
assertEquals(0, tasks.getCount());
}
public void testTaskTableUpgrade() {
TaskController taskController = new TaskController(getContext());
taskController.open();
// create some ish
TaskModelForEdit griffey = new TaskModelForEdit();
griffey.setName("ken griffey jr");
griffey.setDefiniteDueDate(new Date());
griffey.setDefiniteDueDate(new Date(1234567L));
griffey.setImportance(Importance.LEVEL_1);
griffey.setEstimatedSeconds(3212);
griffey.setNotes("debut game: 1989");
@ -54,15 +67,15 @@ public class Astrid2To3UpgradeTests extends DatabaseTestCase {
Date createdDate = new Date();
// assert created
assertEquals(2, taskController.getAllTaskIdentifiers());
assertEquals(2, taskController.getAllTaskIdentifiers().size());
// upgrade
taskController.close();
upgrade2To3();
// verify that it ain't no more in the legacy table
taskController.open();
assertEquals(0, taskController.getAllTaskIdentifiers());
assertEquals(0, taskController.getAllTaskIdentifiers().size());
taskController.close();
// verify that data exists in our new table
TodorooCursor<Task> tasks = taskDao.query(database, Query.select(Task.PROPERTIES));

Loading…
Cancel
Save