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,36 +193,20 @@ 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))));
try {
if(cursor.getCount() > 0) {
cursor.moveToNext();
if(existingTask == 0) {
skipCount++; skipCount++;
return; } else {
}
}
} finally {
cursor.close();
}
// else, make a new task model and add away.
deserializeModel(currentTask, Task.PROPERTIES); deserializeModel(currentTask, Task.PROPERTIES);
if(existingTask > 0) {
currentTask.setId(existingTask);
} else {
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) {
if(!currentTask.isSaved()) { if(!currentTask.isSaved()) {

@ -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,19 +168,12 @@ 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);
TodorooCursor<Task> cursor = taskDao.get().query(Query.select(Task.ID, Task.TITLE,
Task.IMPORTANCE, Task.DUE_DATE).where(Criterion.and(TaskCriteria.isActive(),
TaskCriteria.isVisible())).
orderBy(SortHelper.defaultTaskOrder()).limit(MAX_NUMBER_OF_TASKS));
try {
List<Integer> importanceColors = checkBoxes.get().getPriorityColors(); List<Integer> importanceColors = checkBoxes.get().getPriorityColors();
for (int i = 0; i < cursor.getCount(); i++) { Query query = Query.select(Task.ID, Task.TITLE, Task.IMPORTANCE, Task.DUE_DATE)
cursor.moveToNext(); .where(Criterion.and(TaskCriteria.isActive(), TaskCriteria.isVisible()))
Task task = new Task(cursor); .orderBy(SortHelper.defaultTaskOrder()).limit(MAX_NUMBER_OF_TASKS);
taskDao.get().forEach(query, task -> {
String taskTags = getTagsAsString(task.getId(), TAG_SEPARATOR); String taskTags = getTagsAsString(task.getId(), TAG_SEPARATOR);
Object[] values = new Object[7]; Object[] values = new Object[7];
@ -194,11 +186,7 @@ public class Astrid2TaskProvider extends InjectingContentProvider {
values[6] = taskTags; values[6] = taskTags;
ret.addRow(values); 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(); return tasks.size();
} finally {
cursor.close();
}
} }
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,21 +94,13 @@ 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);
try {
now = DateUtilities.now(); // Before mass scheduling, initialize now variable now = DateUtilities.now(); // Before mass scheduling, initialize now variable
for(cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) { Query query = Query.select(NOTIFICATION_PROPERTIES).where(Criterion.and(
Task task = new Task(cursor); TaskCriteria.isActive(),
scheduleAlarm(task, null); Criterion.or(Task.REMINDER_FLAGS.gt(0), Task.REMINDER_PERIOD.gt(0))));
} taskDao.forEach(query, task -> scheduleAlarm(task, null));
} catch (Exception e) {
// suppress
Timber.e(e, e.getMessage());
} finally {
cursor.close();
now = -1; // Signal done with now variable now = -1; // Signal done with now variable
} }
}
private long getNowValue() { private long getNowValue() {
// If we're in the midst of mass scheduling, use the prestored now var // If we're in the midst of mass scheduling, use the prestored now var
@ -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) {
return;
}
for(cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
long id = cursor.getLong(0);
if (suppress == null || suppress != id) { if (suppress == null || suppress != id) {
taskDao.delete(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