diff --git a/api/src/main/java/com/todoroo/andlib/data/DatabaseDao.java b/api/src/main/java/com/todoroo/andlib/data/DatabaseDao.java index ceb7933c3..718ef0a81 100644 --- a/api/src/main/java/com/todoroo/andlib/data/DatabaseDao.java +++ b/api/src/main/java/com/todoroo/andlib/data/DatabaseDao.java @@ -95,6 +95,10 @@ public class DatabaseDao { return result; } + public void query(Query query, Callback callback) { + query(callback, query); + } + public void query(Callback callback, Query query) { TodorooCursor cursor = query(query); try { diff --git a/astrid/src/main/java/com/todoroo/astrid/backup/TasksXmlExporter.java b/astrid/src/main/java/com/todoroo/astrid/backup/TasksXmlExporter.java index 4d69a4a76..da04b16fc 100644 --- a/astrid/src/main/java/com/todoroo/astrid/backup/TasksXmlExporter.java +++ b/astrid/src/main/java/com/todoroo/astrid/backup/TasksXmlExporter.java @@ -22,7 +22,6 @@ import com.todoroo.andlib.sql.Query; import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.andlib.utility.DialogUtilities; import com.todoroo.astrid.dao.MetadataDao; -import com.todoroo.astrid.dao.MetadataDao.MetadataCriteria; import com.todoroo.astrid.dao.TagDataDao; import com.todoroo.astrid.data.Metadata; import com.todoroo.astrid.data.TagData; @@ -214,19 +213,18 @@ public class TasksXmlExporter { } private synchronized void serializeMetadata(Task task) throws IOException { - TodorooCursor cursor = metadataDao.query(Query.select( - Metadata.PROPERTIES).where(MetadataCriteria.byTask(task.getId()))); - try { - for(cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) { - Metadata metadata = new Metadata(cursor); - - xml.startTag(null, BackupConstants.METADATA_TAG); - serializeModel(metadata, Metadata.PROPERTIES, Metadata.ID, Metadata.TASK); - xml.endTag(null, BackupConstants.METADATA_TAG); + metadataDao.byTask(task.getId(), new Callback() { + @Override + public void apply(Metadata metadata) { + try { + xml.startTag(null, BackupConstants.METADATA_TAG); + serializeModel(metadata, Metadata.PROPERTIES, Metadata.ID, Metadata.TASK); + xml.endTag(null, BackupConstants.METADATA_TAG); + } catch (IOException e) { + throw new RuntimeException(e); + } } - } finally { - cursor.close(); - } + }); } /** diff --git a/astrid/src/main/java/com/todoroo/astrid/dao/MetadataDao.java b/astrid/src/main/java/com/todoroo/astrid/dao/MetadataDao.java index c5d791f6f..05b8a7dc5 100644 --- a/astrid/src/main/java/com/todoroo/astrid/dao/MetadataDao.java +++ b/astrid/src/main/java/com/todoroo/astrid/dao/MetadataDao.java @@ -75,6 +75,10 @@ public class MetadataDao extends DatabaseDao { Metadata.TASK.eq(Task.ID))).where(Task.TITLE.isNull()))); } + public void byTask(long taskId, Callback callback) { + query(callback, Query.select(Metadata.PROPERTIES).where(Metadata.TASK.eq(taskId))); + } + public void byTaskAndKey(long taskId, String key, Callback callback) { query(callback, Query.select(Metadata.PROPERTIES).where( Criterion.and(Metadata.TASK.eq(taskId), Metadata.KEY.eq(key)))); diff --git a/astrid/src/main/java/com/todoroo/astrid/gtasks/GtasksMetadataService.java b/astrid/src/main/java/com/todoroo/astrid/gtasks/GtasksMetadataService.java index 70dc7511a..b7b3519cd 100644 --- a/astrid/src/main/java/com/todoroo/astrid/gtasks/GtasksMetadataService.java +++ b/astrid/src/main/java/com/todoroo/astrid/gtasks/GtasksMetadataService.java @@ -8,7 +8,7 @@ package com.todoroo.astrid.gtasks; import android.text.TextUtils; import com.todoroo.andlib.data.AbstractModel; -import com.todoroo.andlib.data.TodorooCursor; +import com.todoroo.andlib.data.Callback; import com.todoroo.andlib.sql.Criterion; import com.todoroo.andlib.sql.Field; import com.todoroo.andlib.sql.Functions; @@ -45,10 +45,6 @@ public final class GtasksMetadataService extends SyncMetadataService cursor = metadataDao.query(Query.select(Metadata.PROPERTIES). - where(Criterion.and(MetadataCriteria.withKey(getMetadataKey()), - getLocalMatchCriteria(remoteTask)))); - try { - if(cursor.getCount() == 0) { - return; - } - cursor.moveToFirst(); - remoteTask.task.setId(cursor.get(Metadata.TASK)); + Metadata metadata = getMetadataByGtaskId(remoteTask.gtaskMetadata.getValue(GtasksMetadata.ID)); + if (metadata != null) { + remoteTask.task.setId(metadata.getValue(Metadata.TASK)); remoteTask.task.setUuid(taskDao.uuidFromLocalId(remoteTask.task.getId())); - remoteTask.gtaskMetadata = new Metadata(cursor); - } finally { - cursor.close(); + remoteTask.gtaskMetadata = metadata; } } public long localIdForGtasksId(String gtasksId) { - TodorooCursor metadata = metadataDao.query(Query.select(Metadata.TASK).where( - Criterion.and(Metadata.KEY.eq(GtasksMetadata.METADATA_KEY), GtasksMetadata.ID.eq(gtasksId)))); - try { - if (metadata.getCount() > 0) { - metadata.moveToFirst(); - return (new Metadata(metadata).getTask()); - } else { - return AbstractModel.NO_ID; - } - } finally { - metadata.close(); - } + Metadata metadata = getMetadataByGtaskId(gtasksId); + return metadata == null ? AbstractModel.NO_ID : metadata.getTask(); + } + + private Metadata getMetadataByGtaskId(String gtaskId) { + return metadataDao.getFirst(Query.select(Metadata.PROPERTIES).where(Criterion.and( + Metadata.KEY.eq(getMetadataKey()), + GtasksMetadata.ID.eq(gtaskId)))); } // --- list iterating helpers @@ -96,7 +80,7 @@ public final class GtasksMetadataService extends SyncMetadataService cursor = metadataDao.query(query); - try { - for(cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) { - long taskId = cursor.get(Metadata.TASK); + + metadataDao.query(query, new Callback() { + @Override + public void apply(Metadata entry) { + long taskId = entry.getValue(Metadata.TASK); Metadata metadata = getTaskMetadata(taskId); - if(metadata == null) { - continue; + if(metadata != null) { + iterator.processTask(taskId, metadata); } - iterator.processTask(taskId, metadata); } - - } finally { - cursor.close(); - } + }); } /** diff --git a/astrid/src/main/java/com/todoroo/astrid/utility/SyncMetadataService.java b/astrid/src/main/java/com/todoroo/astrid/utility/SyncMetadataService.java index c4fbfa84d..cac25e6c9 100644 --- a/astrid/src/main/java/com/todoroo/astrid/utility/SyncMetadataService.java +++ b/astrid/src/main/java/com/todoroo/astrid/utility/SyncMetadataService.java @@ -7,7 +7,7 @@ package com.todoroo.astrid.utility; import android.content.ContentValues; -import com.todoroo.andlib.data.TodorooCursor; +import com.todoroo.andlib.data.Callback; import com.todoroo.andlib.sql.Query; import com.todoroo.astrid.dao.MetadataDao; import com.todoroo.astrid.dao.MetadataDao.MetadataCriteria; @@ -17,6 +17,7 @@ import com.todoroo.astrid.sync.SyncContainer; import java.util.ArrayList; import java.util.HashSet; +import java.util.Set; abstract public class SyncMetadataService { @@ -56,17 +57,8 @@ abstract public class SyncMetadataService { * @return null if no metadata found */ public Metadata getTaskMetadata(long taskId) { - TodorooCursor cursor = metadataDao.query(Query.select(Metadata.PROPERTIES).where( + return metadataDao.getFirst(Query.select(Metadata.PROPERTIES).where( MetadataCriteria.byTaskAndwithKey(taskId, getMetadataKey()))); - try { - if(cursor.getCount() == 0) { - return null; - } - cursor.moveToFirst(); - return new Metadata(cursor); - } finally { - cursor.close(); - } } /** @@ -79,19 +71,16 @@ abstract public class SyncMetadataService { * @param metadataKey metadata key */ private void synchronizeMetadata(long taskId, ArrayList metadata, String metadataKey) { - HashSet newMetadataValues = new HashSet<>(); + final Set newMetadataValues = new HashSet<>(); for(Metadata metadatum : metadata) { metadatum.setTask(taskId); metadatum.clearValue(Metadata.ID); newMetadataValues.add(metadatum.getMergedValues()); } - TodorooCursor cursor = metadataDao.query(Query.select(Metadata.PROPERTIES).where( - MetadataCriteria.byTaskAndwithKey(taskId, metadataKey))); - try { - // try to find matches within our metadata list - for(cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) { - Metadata item = new Metadata(cursor); + metadataDao.byTaskAndKey(taskId, metadataKey, new Callback() { + @Override + public void apply(Metadata item) { long id = item.getId(); // clear item id when matching with incoming values @@ -99,15 +88,12 @@ abstract public class SyncMetadataService { ContentValues itemMergedValues = item.getMergedValues(); if(newMetadataValues.contains(itemMergedValues)) { newMetadataValues.remove(itemMergedValues); - continue; + } else { + // not matched. cut it + metadataDao.delete(id); } - - // not matched. cut it - metadataDao.delete(id); } - } finally { - cursor.close(); - } + }); // everything that remains shall be written for(ContentValues values : newMetadataValues) {