Skip to content

Commit

Permalink
return a CursorList from ManyQuery which lazily instantiates models f…
Browse files Browse the repository at this point in the history
…rom the cursor
  • Loading branch information
emilsjolander committed Nov 28, 2013
1 parent d246228 commit c028449
Show file tree
Hide file tree
Showing 4 changed files with 109 additions and 37 deletions.
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
VERSION_NAME=0.1.0
VERSION_NAME=0.1.1
GROUP=se.emilsjolander

POM_DESCRIPTION=Sprinkles is a boiler-plate-reduction-library for dealing with databases in android applications
Expand Down
39 changes: 39 additions & 0 deletions library/src/se/emilsjolander/sprinkles/CursorIterator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package se.emilsjolander.sprinkles;

import android.database.Cursor;

import java.util.Iterator;

/**
* Created by emilsjolander on 28/11/13.
*/
public class CursorIterator<T extends Model> implements Iterator<T> {

private Cursor cursor;
private Class<T> type;
private int pos = -1;

CursorIterator(Cursor cursor, Class<T> type) {
this.cursor = cursor;
this.type = type;
}

@Override
public boolean hasNext() {
cursor.moveToPosition(pos);
return !cursor.isLast();
}

@Override
public T next() {
pos++;
cursor.moveToPosition(pos);
return Utils.getModelFromCursor(type, cursor);
}

@Override
public void remove() {
throw new UnsupportedOperationException();
}

}
Original file line number Diff line number Diff line change
@@ -1,22 +1,62 @@
package se.emilsjolander.sprinkles;

import java.util.ArrayList;

import android.database.Cursor;
import android.os.AsyncTask;

public class ModelList<T extends Model> extends ArrayList<T> {
import java.io.Closeable;
import java.io.IOException;
import java.util.Iterator;

public class CursorList<T extends Model> implements Iterable<T>, Closeable {

private static final long serialVersionUID = 9111033070491580889L;

public interface OnAllSavedCallback {
public interface OnAllSavedCallback {
void onAllSaved();
}

public interface OnAllDeletedCallback {
void onAllDeleted();
}

public boolean saveAll() {
private Cursor cursor;
private Class<T> type;
private boolean closed;

CursorList(Cursor cursor, Class<T> type) {
this.cursor = cursor;
this.type = type;
}

public int size() {
return cursor == null ? 0 : cursor.getCount();
}

public T get(int pos) {
requireOpen();
cursor.moveToPosition(pos);
return Utils.getModelFromCursor(type, cursor);
}

@Override
public Iterator<T> iterator() {
return new CursorIterator(cursor, type);
}

@Override
public void close() throws IOException {
cursor.close();
closed = true;
}

private void requireOpen() {
if (closed) {
throw new IllegalStateException("Cannot call methods on a closed CursorList");
}
}

public boolean saveAll() {
requireOpen();
Transaction t = new Transaction();
try {
t.setSuccessful(saveAll(t));
Expand All @@ -27,6 +67,7 @@ public boolean saveAll() {
}

public boolean saveAll(Transaction t) {
requireOpen();
for (Model m : this) {
if (!m.save(t)) {
return false;
Expand All @@ -36,10 +77,12 @@ public boolean saveAll(Transaction t) {
}

public void saveAllAsync() {
requireOpen();
saveAllAsync(null);
}

public void saveAllAsync(final OnAllSavedCallback callback) {
requireOpen();
new AsyncTask<Void, Void, Boolean>() {

protected Boolean doInBackground(Void... params) {
Expand All @@ -56,6 +99,7 @@ protected void onPostExecute(Boolean result) {
}

public void deleteAll() {
requireOpen();
Transaction t = new Transaction();
try {
deleteAll(t);
Expand All @@ -66,16 +110,19 @@ public void deleteAll() {
}

public void deleteAll(Transaction t) {
requireOpen();
for (Model m : this) {
m.delete(t);
}
}

public void deleteAllAsync() {
requireOpen();
deleteAllAsync(null);
}

public void deleteAllAsync(final OnAllDeletedCallback callback) {
requireOpen();
new AsyncTask<Void, Void, Void>() {

protected Void doInBackground(Void... params) {
Expand Down
48 changes: 17 additions & 31 deletions library/src/se/emilsjolander/sprinkles/ManyQuery.java
Original file line number Diff line number Diff line change
@@ -1,15 +1,14 @@
package se.emilsjolander.sprinkles;

import java.util.List;

import se.emilsjolander.sprinkles.Query.OnQueryResultHandler;
import android.app.LoaderManager;
import android.app.LoaderManager.LoaderCallbacks;
import android.content.Loader;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;

import se.emilsjolander.sprinkles.Query.OnQueryResultHandler;

public final class ManyQuery<T extends Model> {

Class<T> resultClass;
Expand All @@ -18,27 +17,20 @@ public final class ManyQuery<T extends Model> {
ManyQuery() {
}

public List<T> get() {
public CursorList<T> get() {
final SQLiteDatabase db = DbOpenHelper.getInstance();
final Cursor c = db.rawQuery(sqlQuery, null);

ModelList<T> result = new ModelList<T>();
while (c.moveToNext()) {
result.add(Utils.getModelFromCursor(resultClass, c));
}

c.close();
return result;
return new CursorList<T>(c, resultClass);
}

public void getAsync(LoaderManager lm, OnQueryResultHandler<List<T>> handler) {
public void getAsync(LoaderManager lm, OnQueryResultHandler<CursorList<T>> handler) {
final int loaderId = sqlQuery.hashCode();
lm.initLoader(loaderId, null,
getLoaderCallbacks(sqlQuery, resultClass, handler, false, null));
}

public void getAsyncWithUpdates(LoaderManager lm,
OnQueryResultHandler<List<T>> handler,
OnQueryResultHandler<CursorList<T>> handler,
Class<?>... respondsToUpdatedOf) {
final int loaderId = sqlQuery.hashCode();
lm.initLoader(
Expand All @@ -52,24 +44,19 @@ public void getAsyncWithUpdates(LoaderManager lm,

private LoaderCallbacks<Cursor> getLoaderCallbacks(final String sqlQuery,
final Class<T> resultClass,
final OnQueryResultHandler<List<T>> handler,
final OnQueryResultHandler<CursorList<T>> handler,
final boolean getUpdates,
final Class<? extends Model>[] respondsToUpdatedOf) {
return new LoaderCallbacks<Cursor>() {

@Override
public void onLoaderReset(Loader<Cursor> arg0) {
handler.onResult(new ModelList<T>());
handler.onResult(new CursorList<T>(null, null));
}

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor c) {
ModelList<T> result = new ModelList<T>();
while (c.moveToNext()) {
result.add(Utils.getModelFromCursor(resultClass, c));
}
handler.onResult(result);

handler.onResult(new CursorList<T>(c, resultClass));
if (!getUpdates) {
loader.abandon();
}
Expand All @@ -84,7 +71,7 @@ public Loader<Cursor> onCreateLoader(int id, Bundle args) {
}

public void getAsync(android.support.v4.app.LoaderManager lm,
OnQueryResultHandler<List<T>> handler) {
OnQueryResultHandler<CursorList<T>> handler) {
final int loaderId = sqlQuery.hashCode();
lm.initLoader(
loaderId,
Expand All @@ -94,7 +81,7 @@ public void getAsync(android.support.v4.app.LoaderManager lm,
}

public void getAsyncWithUpdates(android.support.v4.app.LoaderManager lm,
OnQueryResultHandler<List<T>> handler,
OnQueryResultHandler<CursorList<T>> handler,
Class<?>... respondsToUpdatedOf) {
final int loaderId = sqlQuery.hashCode();
lm.initLoader(
Expand All @@ -108,25 +95,24 @@ public void getAsyncWithUpdates(android.support.v4.app.LoaderManager lm,

private android.support.v4.app.LoaderManager.LoaderCallbacks<Cursor> getSupportLoaderCallbacks(
final String sqlQuery, final Class<T> resultClass,
final OnQueryResultHandler<List<T>> handler,
final OnQueryResultHandler<CursorList<T>> handler,
final boolean getUpdates,
final Class<? extends Model>[] respondsToUpdatedOf) {
return new android.support.v4.app.LoaderManager.LoaderCallbacks<Cursor>() {

@Override
public void onLoaderReset(
android.support.v4.content.Loader<Cursor> arg0) {
handler.onResult(new ModelList<T>());
handler.onResult(new CursorList<T>(null, null));
}

@Override
public void onLoadFinished(
android.support.v4.content.Loader<Cursor> loader, Cursor c) {
ModelList<T> result = new ModelList<T>();
while (c.moveToNext()) {
result.add(Utils.getModelFromCursor(resultClass, c));
}
handler.onResult(result);
handler.onResult(new CursorList<T>(c, resultClass));
if (!getUpdates) {
loader.abandon();
}

if (!getUpdates) {
loader.abandon();
Expand Down

0 comments on commit c028449

Please sign in to comment.