Fixin' tests, fixin' the content provider, i think it's in decent shape now. All unit tests pass!

pull/14/head
Tim Su 14 years ago
parent 0b77d19f7d
commit ed60492f18

@ -279,9 +279,8 @@ public abstract class AbstractModel implements Parcelable {
*/
public synchronized <TYPE> void mergeWith(ContentValues other) {
if (setValues == null)
setValues = other;
else
setValues.putAll(other);
setValues = new ContentValues();
setValues.putAll(other);
}
/**

@ -183,8 +183,12 @@ public class GenericDao<TYPE extends AbstractModel> {
public boolean createNew(TYPE item) {
long newRow = database.insert(table.name,
AbstractModel.ID_PROPERTY.name, item.getMergedValues());
item.setId(newRow);
return newRow >= 0;
boolean result = newRow >= 0;
if(result) {
item.markSaved();
item.setId(newRow);
}
return result;
}
/**
@ -199,10 +203,13 @@ public class GenericDao<TYPE extends AbstractModel> {
*/
public boolean saveExisting(TYPE item) {
ContentValues values = item.getSetValues();
if(values.size() == 0) // nothing changed
if(values == null || values.size() == 0) // nothing changed
return true;
return database.update(table.name, values,
boolean result = database.update(table.name, values,
AbstractModel.ID_PROPERTY.eq(item.getId()).toString(), null) > 0;
if(result)
item.markSaved();
return result;
}
// --- helper methods

@ -8,6 +8,7 @@ import android.content.ContentUris;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteQueryBuilder;
import android.net.Uri;
import android.text.TextUtils;
@ -149,8 +150,8 @@ public class Astrid3ContentProvider extends ContentProvider {
public GenericDao<TYPE> dao;
/** creates from given model */
public void create() {
dao.createNew(model);
public boolean create() {
return dao.createNew(model);
}
/** updates from given model */
@ -258,7 +259,9 @@ public class Astrid3ContentProvider extends ContentProvider {
case URI_DIR: {
helper.model.mergeWith(values);
helper.create();
if(!helper.create())
throw new SQLException("Could not insert row into database (constraint failed?)");
Uri newUri = ContentUris.withAppendedId(uri, helper.model.getId());
getContext().getContentResolver().notifyChange(newUri, null);
return newUri;
@ -278,6 +281,33 @@ public class Astrid3ContentProvider extends ContentProvider {
String[] selectionArgs) {
UriHelper<?> helper = generateHelper(uri, true);
switch (uriMatcher.match(uri)) {
// illegal operations
case URI_GROUP:
throw new IllegalArgumentException("Only the / or /# URI is valid"
+ " for update.");
// valid operations
case URI_ITEM: {
String itemSelector = String.format("%s = '%s'",
AbstractModel.ID_PROPERTY, uri.getPathSegments().get(1));
if(TextUtils.isEmpty(selection))
selection = itemSelector;
else
selection = itemSelector + " AND " + selection;
}
case URI_DIR:
break;
default:
throw new IllegalArgumentException("Unknown URI " + uri + " (" + uriMatcher.match(uri) + ")");
}
Cursor cursor = query(uri, new String[] { AbstractModel.ID_PROPERTY.name },
selection, selectionArgs, null);
try {
@ -319,7 +349,7 @@ public class Astrid3ContentProvider extends ContentProvider {
switch (uriMatcher.match(uri)) {
case URI_GROUP:
groupBy = uri.getPathSegments().get(1);
groupBy = uri.getPathSegments().get(2);
case URI_DIR:
break;
case URI_ITEM:

@ -102,7 +102,7 @@ public class Astrid3ProviderTests extends DatabaseTestCase {
assertEquals("tujiko noriko", cursor.getString(1));
cursor.close();
cursor = resolver.query(uri, PROJECTION, Task.IMPORTANCE + "<" +
cursor = resolver.query(uri, PROJECTION, Task.IMPORTANCE + ">" +
Task.IMPORTANCE_MUST_DO, null, null);
assertEquals(1, cursor.getCount());
cursor.moveToFirst();
@ -123,7 +123,6 @@ public class Astrid3ProviderTests extends DatabaseTestCase {
ContentValues values = new ContentValues();
values.put(Task.TITLE.name, "carlos silva");
values.put(Task.IMPORTANCE.name, Task.IMPORTANCE_SHOULD_DO);
resolver.insert(Task.CONTENT_URI, values);
Uri carlosUri = resolver.insert(Task.CONTENT_URI, values);
@ -148,7 +147,7 @@ public class Astrid3ProviderTests extends DatabaseTestCase {
values.put(Task.TITLE.name, "carlos who?");
assertEquals(1, resolver.update(carlosUri, values, null, null));
cursor = resolver.query(Task.CONTENT_URI, projection, "'title' = 'carlos who?'", null, null);
cursor = resolver.query(Task.CONTENT_URI, projection, Task.TITLE.eq("carlos who?").toString(), null, null);
assertEquals(1, cursor.getCount());
cursor.close();
@ -220,7 +219,7 @@ public class Astrid3ProviderTests extends DatabaseTestCase {
cursor.close();
assertEquals(1, resolver.delete(allItemsUri, Task.IMPORTANCE.name +
"<" + Task.IMPORTANCE_MUST_DO, null));
">" + Task.IMPORTANCE_MUST_DO, null));
cursor = resolver.query(allItemsUri, PROJECTION, Task.TITLE.name +
" = 'murder city devils'", null, null);
@ -249,7 +248,7 @@ public class Astrid3ProviderTests extends DatabaseTestCase {
values.put(StoreObject.ITEM.name, "mf doom?");
Uri firstUri = resolver.insert(uri, values);
values.put(Task.TITLE.name, "gm grimm!");
values.put(StoreObject.ITEM.name, "gm grimm!");
Uri secondUri = resolver.insert(uri, values);
assertNotSame(firstUri, secondUri);
@ -258,22 +257,22 @@ public class Astrid3ProviderTests extends DatabaseTestCase {
};
Cursor cursor = resolver.query(uri, storeProjection, "1", null, null);
Cursor cursor = resolver.query(uri, storeProjection, null, null, null);
assertEquals(2, cursor.getCount());
cursor.close();
cursor = resolver.query(firstUri, storeProjection, null, null, null);
assertEquals(1, cursor.getCount());
cursor.moveToFirst();
assertEquals("mf doom?", cursor.getString(1));
assertEquals("mf doom?", cursor.getString(0));
cursor.close();
values.put(Task.TITLE.name, "danger mouse.");
values.put(StoreObject.ITEM.name, "danger mouse.");
resolver.update(firstUri, values, null, null);
cursor = resolver.query(firstUri, storeProjection, null, null, null);
assertEquals(1, cursor.getCount());
cursor.moveToFirst();
assertEquals("danger mouse.", cursor.getString(1));
assertEquals("danger mouse.", cursor.getString(0));
cursor.close();
assertEquals(1, resolver.delete(firstUri, null, null));
@ -314,10 +313,14 @@ public class Astrid3ProviderTests extends DatabaseTestCase {
cursor.close();
// test "group-by" with metadata
values.clear();
IntegerProperty age = new IntegerProperty(Metadata.TABLE, Metadata.VALUE1.name);
StringProperty size = Metadata.VALUE2;
uri = Metadata.CONTENT_URI;
values.clear();
values.put(Metadata.TASK.name, 1);
values.put(Metadata.KEY.name, "sizes");
values.put(age.name, 50);
values.put(size.name, "large");
resolver.insert(uri, values);
@ -330,7 +333,7 @@ public class Astrid3ProviderTests extends DatabaseTestCase {
values.put(size.name, "small");
resolver.insert(uri, values);
String[] metadataProjection = new String[] { "AVERAGE(" + age + ")" };
String[] metadataProjection = new String[] { "AVG(" + age + ")" };
Uri groupBySizeUri = Uri.withAppendedPath(Metadata.CONTENT_URI,
AstridApiConstants.GROUP_BY_URI + size.name);

Loading…
Cancel
Save