package carloscsanchezperez.gmail.sixpackon; import static android.provider.BaseColumns._ID; import static carloscsanchezperez.gmail.sixpackon.Constants.AUTHORITY; import static carloscsanchezperez.gmail.sixpackon.Constants.CONTENT_URI; import carloscsanchezperez.gmail.sixpackon.MembersContract.FeedsTable; import android.content.ContentProvider; import android.content.ContentUris; import android.content.ContentValues; import android.content.UriMatcher; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.net.Uri; import android.text.TextUtils; public class EventsProvider extends ContentProvider { private static final int EVENTS = 1; private static final int EVENTS_ID = 2; /** The MIME type of a directory of events */ private static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.example.event"; /** The MIME type of a single event */ private static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/vnd.example.event"; private EventsData events; private UriMatcher uriMatcher; // ... @Override public boolean onCreate() { uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); uriMatcher.addURI(AUTHORITY, "feed", EVENTS); uriMatcher.addURI(AUTHORITY, "feeds/#", EVENTS_ID); events = new EventsData(getContext()); return true; } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String orderBy) { if (uriMatcher.match(uri) == EVENTS_ID) { long id = Long.parseLong(uri.getPathSegments().get(1)); selection = appendRowId(selection, id); } // Get the database and run the query SQLiteDatabase db = events.getReadableDatabase(); Cursor cursor = db.query(FeedsTable.TABLE_NAME, projection, selection, selectionArgs, null, null, orderBy); // Tell the cursor what uri to watch, so it knows when its // source data changes cursor.setNotificationUri(getContext().getContentResolver(), uri); return cursor; } @Override public String getType(Uri uri) { switch (uriMatcher.match(uri)) { case EVENTS: return CONTENT_TYPE; case EVENTS_ID: return CONTENT_ITEM_TYPE; default: throw new IllegalArgumentException("Unknown URI " + uri); } } @Override public Uri insert(Uri uri, ContentValues values) { SQLiteDatabase db = events.getWritableDatabase(); // Validate the requested uri if (uriMatcher.match(uri) != EVENTS) { throw new IllegalArgumentException("Unknown URI " + uri); } // Insert into database long id = db.insertOrThrow(FeedsTable.TABLE_NAME, null, values); // Notify any watchers of the change Uri newUri = ContentUris.withAppendedId(CONTENT_URI, id); getContext().getContentResolver().notifyChange(newUri, null); return newUri; } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { SQLiteDatabase db = events.getWritableDatabase(); int count; switch (uriMatcher.match(uri)) { case EVENTS: count = db.delete(FeedsTable.TABLE_NAME, selection, selectionArgs); break; case EVENTS_ID: long id = Long.parseLong(uri.getPathSegments().get(1)); count = db.delete(FeedsTable.TABLE_NAME, appendRowId(selection, id), selectionArgs); break; default: throw new IllegalArgumentException("Unknown URI " + uri); } // Notify any watchers of the change getContext().getContentResolver().notifyChange(uri, null); return count; } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { SQLiteDatabase db = events.getWritableDatabase(); int count; switch (uriMatcher.match(uri)) { case EVENTS: count = db.update(FeedsTable.TABLE_NAME, values, selection, selectionArgs); break; case EVENTS_ID: long id = Long.parseLong(uri.getPathSegments().get(1)); count = db.update(FeedsTable.TABLE_NAME, values, appendRowId( selection, id), selectionArgs); break; default: throw new IllegalArgumentException("Unknown URI " + uri); } // Notify any watchers of the change getContext().getContentResolver().notifyChange(uri, null); return count; } /** Append an id test to a SQL selection expression */ private String appendRowId(String selection, long id) { return _ID + "=" + id + (!TextUtils.isEmpty(selection) ? " AND (" + selection + ')' : ""); } }