Remove more cursors

pull/467/head
Alex Baker 9 years ago
parent 4137abd55b
commit 42f957ba12

@ -16,7 +16,6 @@ import com.google.common.collect.Iterables;
import com.todoroo.andlib.data.AbstractModel; import com.todoroo.andlib.data.AbstractModel;
import com.todoroo.andlib.data.Property; import com.todoroo.andlib.data.Property;
import com.todoroo.andlib.data.Property.PropertyVisitor; import com.todoroo.andlib.data.Property.PropertyVisitor;
import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.sql.Criterion; import com.todoroo.andlib.sql.Criterion;
import com.todoroo.andlib.sql.Query; import com.todoroo.andlib.sql.Query;
import com.todoroo.andlib.utility.DialogUtilities; import com.todoroo.andlib.utility.DialogUtilities;
@ -194,35 +193,19 @@ public class TasksXmlImporter {
} }
// if the task's name and creation date match an existing task, skip // if the task's name and creation date match an existing task, skip
long existingTask = 0; Query query = Query.select(Task.ID, Task.COMPLETION_DATE, Task.DELETION_DATE)
TodorooCursor<Task> cursor = taskDao.query(Query.select(Task.ID, .where(Criterion.and(Task.TITLE.eq(title), Task.CREATION_DATE.eq(created)));
Task.COMPLETION_DATE, Task.DELETION_DATE). if (taskDao.count(query) > 0) {
where(Criterion.and(Task.TITLE.eq(title), Task.CREATION_DATE.eq(created)))); skipCount++;
try {
if(cursor.getCount() > 0) {
cursor.moveToNext();
if(existingTask == 0) {
skipCount++;
return;
}
}
} finally {
cursor.close();
}
// else, make a new task model and add away.
deserializeModel(currentTask, Task.PROPERTIES);
if(existingTask > 0) {
currentTask.setId(existingTask);
} else { } else {
deserializeModel(currentTask, Task.PROPERTIES);
currentTask.setId(Task.NO_ID); currentTask.setId(Task.NO_ID);
}
// Save the task to the database. // Save the task to the database.
taskDao.save(currentTask); taskDao.save(currentTask);
importCount++; importCount++;
}
} }
void parseMetadata(int format) { void parseMetadata(int format) {

@ -14,7 +14,6 @@ import com.todoroo.astrid.dao.Database;
import com.todoroo.astrid.dao.MetadataDao; import com.todoroo.astrid.dao.MetadataDao;
import com.todoroo.astrid.dao.TaskDao; import com.todoroo.astrid.dao.TaskDao;
import com.todoroo.astrid.data.Task; import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.service.TaskDeleter;
import org.tasks.R; import org.tasks.R;
import org.tasks.calendars.CalendarEventProvider; import org.tasks.calendars.CalendarEventProvider;
@ -31,7 +30,6 @@ import javax.inject.Inject;
public class OldTaskPreferences extends InjectingPreferenceActivity { public class OldTaskPreferences extends InjectingPreferenceActivity {
@Inject DialogBuilder dialogBuilder; @Inject DialogBuilder dialogBuilder;
@Inject TaskDeleter taskDeleter;
@Inject MetadataDao metadataDao; @Inject MetadataDao metadataDao;
@Inject Preferences preferences; @Inject Preferences preferences;
@Inject Database database; @Inject Database database;
@ -106,7 +104,7 @@ public class OldTaskPreferences extends InjectingPreferenceActivity {
Query query = Query.select(Task.ID, Task.CALENDAR_URI) Query query = Query.select(Task.ID, Task.CALENDAR_URI)
.where(Criterion.and(Task.DELETION_DATE.gt(0), Task.CALENDAR_URI.isNotNull())); .where(Criterion.and(Task.DELETION_DATE.gt(0), Task.CALENDAR_URI.isNotNull()));
taskDao.forEach(query, calendarEventProvider::deleteEvent); taskDao.forEach(query, calendarEventProvider::deleteEvent);
int result = taskDeleter.purgeDeletedTasks(); int result = taskDao.deleteWhere(Task.DELETION_DATE.gt(0));
metadataDao.removeDanglingMetadata(); metadataDao.removeDanglingMetadata();
return result; return result;
} }

@ -104,8 +104,8 @@ public class TaskDao {
return dao.toList(Query.select(Task.PROPERTIES).withQueryTemplate(query)); return dao.toList(Query.select(Task.PROPERTIES).withQueryTemplate(query));
} }
public TodorooCursor<Task> rawQuery(String selection, String[] selectionArgs, Property.LongProperty id) { public List<Task> rawQuery(String selection, String[] selectionArgs, Property.LongProperty id) {
return dao.rawQuery(selection, selectionArgs, id); return dao.rawQuery(selection, selectionArgs, id).toList();
} }
/** /**

@ -14,7 +14,6 @@ import android.net.Uri;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import com.google.common.base.Joiner; import com.google.common.base.Joiner;
import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.sql.Criterion; import com.todoroo.andlib.sql.Criterion;
import com.todoroo.andlib.sql.Query; import com.todoroo.andlib.sql.Query;
import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.andlib.utility.DateUtilities;
@ -169,36 +168,25 @@ public class Astrid2TaskProvider extends InjectingContentProvider {
* @return cursor as described above * @return cursor as described above
*/ */
private Cursor getTasks() { private Cursor getTasks() {
MatrixCursor ret = new MatrixCursor(TASK_FIELD_LIST); MatrixCursor ret = new MatrixCursor(TASK_FIELD_LIST);
List<Integer> importanceColors = checkBoxes.get().getPriorityColors();
TodorooCursor<Task> cursor = taskDao.get().query(Query.select(Task.ID, Task.TITLE, Query query = Query.select(Task.ID, Task.TITLE, Task.IMPORTANCE, Task.DUE_DATE)
Task.IMPORTANCE, Task.DUE_DATE).where(Criterion.and(TaskCriteria.isActive(), .where(Criterion.and(TaskCriteria.isActive(), TaskCriteria.isVisible()))
TaskCriteria.isVisible())). .orderBy(SortHelper.defaultTaskOrder()).limit(MAX_NUMBER_OF_TASKS);
orderBy(SortHelper.defaultTaskOrder()).limit(MAX_NUMBER_OF_TASKS)); taskDao.get().forEach(query, task -> {
try { String taskTags = getTagsAsString(task.getId(), TAG_SEPARATOR);
List<Integer> importanceColors = checkBoxes.get().getPriorityColors();
for (int i = 0; i < cursor.getCount(); i++) { Object[] values = new Object[7];
cursor.moveToNext(); values[0] = task.getTitle();
Task task = new Task(cursor); values[1] = importanceColors.get(task.getImportance());
values[2] = task.getDueDate();
String taskTags = getTagsAsString(task.getId(), TAG_SEPARATOR); values[3] = task.getDueDate();
values[4] = task.getImportance();
Object[] values = new Object[7]; values[5] = task.getId();
values[0] = task.getTitle(); values[6] = taskTags;
values[1] = importanceColors.get(task.getImportance());
values[2] = task.getDueDate(); ret.addRow(values);
values[3] = task.getDueDate(); });
values[4] = task.getImportance();
values[5] = task.getId();
values[6] = taskTags;
ret.addRow(values);
}
} finally {
cursor.close();
}
return ret; return ret;
} }
@ -268,16 +256,12 @@ public class Astrid2TaskProvider extends InjectingContentProvider {
* Update database based on selection and values * Update database based on selection and values
*/ */
private int updateBySelection(String selection, String[] selectionArgs, Task taskValues) { private int updateBySelection(String selection, String[] selectionArgs, Task taskValues) {
TodorooCursor<Task> cursor = taskDao.get().rawQuery(selection, selectionArgs, Task.ID); List<Task> tasks = taskDao.get().rawQuery(selection, selectionArgs, Task.ID);
try { for (Task task : tasks) {
for(cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) { taskValues.setID(task.getId());
taskValues.setID(cursor.get(Task.ID)); taskDao.get().save(taskValues);
taskDao.get().save(taskValues);
}
return cursor.getCount();
} finally {
cursor.close();
} }
return tasks.size();
} }
public static void notifyDatabaseModification(Context context) { public static void notifyDatabaseModification(Context context) {

@ -11,7 +11,6 @@ import android.content.Context;
import android.content.Intent; import android.content.Intent;
import com.todoroo.andlib.data.Property; import com.todoroo.andlib.data.Property;
import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.sql.Criterion; import com.todoroo.andlib.sql.Criterion;
import com.todoroo.andlib.sql.Query; import com.todoroo.andlib.sql.Query;
import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.andlib.utility.DateUtilities;
@ -95,20 +94,12 @@ public final class ReminderService {
* Schedules all alarms * Schedules all alarms
*/ */
public void scheduleAllAlarms(TaskDao taskDao) { public void scheduleAllAlarms(TaskDao taskDao) {
TodorooCursor<Task> cursor = getTasksWithReminders(taskDao, NOTIFICATION_PROPERTIES); now = DateUtilities.now(); // Before mass scheduling, initialize now variable
try { Query query = Query.select(NOTIFICATION_PROPERTIES).where(Criterion.and(
now = DateUtilities.now(); // Before mass scheduling, initialize now variable TaskCriteria.isActive(),
for(cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) { Criterion.or(Task.REMINDER_FLAGS.gt(0), Task.REMINDER_PERIOD.gt(0))));
Task task = new Task(cursor); taskDao.forEach(query, task -> scheduleAlarm(task, null));
scheduleAlarm(task, null); now = -1; // Signal done with now variable
}
} catch (Exception e) {
// suppress
Timber.e(e, e.getMessage());
} finally {
cursor.close();
now = -1; // Signal done with now variable
}
} }
private long getNowValue() { private long getNowValue() {
@ -368,16 +359,4 @@ public final class ReminderService {
} }
} }
} }
// --- data fetching methods
/**
* Gets a listing of all tasks that are active &
* @return todoroo cursor. PLEASE CLOSE THIS CURSOR!
*/
private TodorooCursor<Task> getTasksWithReminders(TaskDao taskDao, Property<?>... properties) {
return taskDao.query(Query.select(properties).where(Criterion.and(
TaskCriteria.isActive(),
Criterion.or(Task.REMINDER_FLAGS.gt(0), Task.REMINDER_PERIOD.gt(0)))));
}
} }

@ -1,6 +1,5 @@
package com.todoroo.astrid.service; package com.todoroo.astrid.service;
import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.sql.Query; import com.todoroo.andlib.sql.Query;
import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.astrid.dao.TaskDao; import com.todoroo.astrid.dao.TaskDao;
@ -25,26 +24,13 @@ public class TaskDeleter {
* Clean up tasks. Typically called on startup * Clean up tasks. Typically called on startup
*/ */
public void deleteTasksWithEmptyTitles(Long suppress) { public void deleteTasksWithEmptyTitles(Long suppress) {
TodorooCursor<Task> cursor = taskDao.query( Query query = Query.select(Task.ID).where(TaskDao.TaskCriteria.hasNoTitle());
Query.select(Task.ID).where(TaskDao.TaskCriteria.hasNoTitle())); taskDao.forEach(query, task -> {
try { long id = task.getId();
if(cursor.getCount() == 0) { if (suppress == null || suppress != id) {
return; taskDao.delete(id);
} }
});
for(cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
long id = cursor.getLong(0);
if (suppress == null || suppress != id) {
taskDao.delete(id);
}
}
} finally {
cursor.close();
}
}
public int purgeDeletedTasks() {
return taskDao.deleteWhere(Task.DELETION_DATE.gt(0));
} }
public void delete(Task item) { public void delete(Task item) {

Loading…
Cancel
Save