Move some helper functionality to TodorooCursor

pull/467/head
Alex Baker 8 years ago
parent 4447247258
commit ddbd656485

@ -14,7 +14,6 @@ import com.todoroo.astrid.dao.Database;
import org.tasks.BuildConfig; import org.tasks.BuildConfig;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
@ -53,9 +52,7 @@ public class DatabaseDao<TYPE extends AbstractModel> {
// --- dao methods // --- dao methods
public List<TYPE> toList(Query query) { public List<TYPE> toList(Query query) {
final List<TYPE> result = new ArrayList<>(); return query(query).toList();
query(result::add, query);
return result;
} }
public void query(Query query, Callback<TYPE> callback) { public void query(Query query, Callback<TYPE> callback) {
@ -63,36 +60,11 @@ public class DatabaseDao<TYPE extends AbstractModel> {
} }
public void query(Callback<TYPE> callback, Query query) { public void query(Callback<TYPE> callback, Query query) {
TodorooCursor<TYPE> cursor = query(query); query(query).forEach(callback);
try {
for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
callback.apply(fromCursor(cursor));
}
} finally {
cursor.close();
}
} }
public TYPE getFirst(Query query) { public TYPE getFirst(Query query) {
TodorooCursor<TYPE> cursor = query(query); return query(query).first();
try {
return cursor.moveToFirst() ? fromCursor(cursor) : null;
} finally {
cursor.close();
}
}
private TYPE fromCursor(TodorooCursor<TYPE> cursor) {
TYPE instance;
try {
instance = modelClass.newInstance();
} catch (InstantiationException e) {
throw new RuntimeException(e);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
instance.readPropertiesFromCursor(cursor);
return instance;
} }
/** /**
@ -105,7 +77,7 @@ public class DatabaseDao<TYPE extends AbstractModel> {
Timber.v(queryString); Timber.v(queryString);
} }
Cursor cursor = database.rawQuery(queryString); Cursor cursor = database.rawQuery(queryString);
return new TodorooCursor<>(cursor, query.getFields()); return new TodorooCursor<>(modelClass, cursor, query.getFields());
} }
/** /**
@ -116,7 +88,7 @@ public class DatabaseDao<TYPE extends AbstractModel> {
for(int i = 0; i < properties.length; i++) { for(int i = 0; i < properties.length; i++) {
fields[i] = properties[i].name; fields[i] = properties[i].name;
} }
return new TodorooCursor<>(database.getDatabase().query(table.name, return new TodorooCursor<>(modelClass, database.getDatabase().query(table.name,
fields, selection, selectionArgs, null, null, null), fields, selection, selectionArgs, null, null, null),
properties); properties);
} }
@ -269,11 +241,6 @@ public class DatabaseDao<TYPE extends AbstractModel> {
// --- helper methods // --- helper methods
public int count(Query query) { public int count(Query query) {
TodorooCursor<TYPE> cursor = query(query); return query(query).count();
try {
return cursor.getCount();
} finally {
cursor.close();
}
} }
} }

@ -10,6 +10,8 @@ import android.database.CursorWrapper;
import com.todoroo.andlib.data.Property.PropertyVisitor; import com.todoroo.andlib.data.Property.PropertyVisitor;
import java.util.ArrayList;
import java.util.List;
import java.util.WeakHashMap; import java.util.WeakHashMap;
/** /**
@ -23,6 +25,7 @@ import java.util.WeakHashMap;
*/ */
public class TodorooCursor<TYPE extends AbstractModel> extends CursorWrapper { public class TodorooCursor<TYPE extends AbstractModel> extends CursorWrapper {
private final Class<TYPE> modelClass;
/** Properties read by this cursor */ /** Properties read by this cursor */
private final Property<?>[] properties; private final Property<?>[] properties;
@ -39,13 +42,63 @@ public class TodorooCursor<TYPE extends AbstractModel> extends CursorWrapper {
* *
* @param properties properties read from this cursor * @param properties properties read from this cursor
*/ */
public TodorooCursor(Cursor cursor, Property<?>[] properties) { public TodorooCursor(Class<TYPE> modelClass, Cursor cursor, Property<?>[] properties) {
super(cursor); super(cursor);
this.modelClass = modelClass;
this.properties = properties; this.properties = properties;
columnIndexCache = new WeakHashMap<>(); columnIndexCache = new WeakHashMap<>();
} }
public List<TYPE> toList() {
try {
List<TYPE> result = new ArrayList<>();
forEach(result::add);
return result;
} finally {
close();
}
}
public void forEach(Callback<TYPE> function) {
try {
for (moveToFirst() ; !isAfterLast() ; moveToNext()) {
function.apply(toModel());
}
} finally {
close();
}
}
public TYPE toModel() {
TYPE instance;
try {
instance = modelClass.newInstance();
} catch (InstantiationException e) {
throw new RuntimeException(e);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
instance.readPropertiesFromCursor(this);
return instance;
}
public int count() {
try {
return getCount();
} finally {
close();
}
}
public TYPE first() {
try {
return moveToFirst() ? toModel() : null;
} finally {
close();
}
}
/** /**
* Get the value for the given property on the underlying {@link Cursor} * Get the value for the given property on the underlying {@link Cursor}
* *

Loading…
Cancel
Save