package fr.tvbarthel.apps.sayitfromthesky.providers; import android.content.ContentProvider; import android.content.ContentValues; import android.content.UriMatcher; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteQueryBuilder; import android.net.Uri; import android.text.TextUtils; import fr.tvbarthel.apps.sayitfromthesky.database.DatabaseHelper; import fr.tvbarthel.apps.sayitfromthesky.database.DrawingTable; import fr.tvbarthel.apps.sayitfromthesky.providers.contracts.DrawingContract; /** * A simple {@link android.content.ContentProvider} used to access data of this application. * <p/> * Inspiration from : http://www.vogella.com/tutorials/AndroidSQLite/article.html */ public class SayItContentProvider extends ContentProvider { // Used for the UriMatcher private static final int DRAWINGS = 10; private static final int DRAWING_ID = 20; private static final UriMatcher URI_MATCHER = new UriMatcher(UriMatcher.NO_MATCH); static { URI_MATCHER.addURI(DrawingContract.AUTHORITY, DrawingContract.PATH, DRAWINGS); URI_MATCHER.addURI(DrawingContract.AUTHORITY, DrawingContract.PATH + "/#", DRAWING_ID); } // database protected DatabaseHelper mDatabaseHelper; @Override public boolean onCreate() { mDatabaseHelper = new DatabaseHelper(getContext()); return true; } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { // Using SQLiteQueryBuilder instead of query() methods. final SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder(); int uriType = URI_MATCHER.match(uri); switch (uriType) { case DRAWING_ID: queryBuilder.appendWhere(DrawingContract.Columns.COLUMN_ID + " = " + uri.getLastPathSegment()); case DRAWINGS: queryBuilder.setTables(DrawingTable.TABLE_NAME); DrawingContract.Columns.checkColumns(projection); break; default: throw new IllegalArgumentException("Unknown URI: " + uri); } SQLiteDatabase readableDatabase = mDatabaseHelper.getReadableDatabase(); Cursor cursorResult = queryBuilder.query(readableDatabase, projection, selection, selectionArgs, null, null, sortOrder); cursorResult.setNotificationUri(getContext().getContentResolver(), uri); return cursorResult; } @Override public String getType(Uri uri) { return null; } @Override public Uri insert(Uri uri, ContentValues values) { int uriType = URI_MATCHER.match(uri); SQLiteDatabase writableDatabase = mDatabaseHelper.getWritableDatabase(); long id = 0; Uri result = null; switch (uriType) { case DRAWINGS: id = writableDatabase.insert(DrawingTable.TABLE_NAME, null, values); result = Uri.parse(DrawingContract.PATH + "/" + id); break; default: throw new IllegalArgumentException("Unknown URI: " + uri); } getContext().getContentResolver().notifyChange(uri, null); return result; } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { int uriType = URI_MATCHER.match(uri); SQLiteDatabase writableDatabase = mDatabaseHelper.getWritableDatabase(); int rowsDeleted; switch (uriType) { case DRAWINGS: rowsDeleted = writableDatabase.delete(DrawingTable.TABLE_NAME, selection, selectionArgs); break; case DRAWING_ID: String id = uri.getLastPathSegment(); if (TextUtils.isEmpty(selection)) { rowsDeleted = writableDatabase.delete(DrawingTable.TABLE_NAME, DrawingContract.Columns.COLUMN_ID + "=" + id, null); } else { rowsDeleted = writableDatabase.delete(DrawingTable.TABLE_NAME, DrawingContract.Columns.COLUMN_ID + "=" + id + " and " + selection, selectionArgs); } break; default: throw new IllegalArgumentException("Unknown Uri: " + uri); } getContext().getContentResolver().notifyChange(uri, null); return rowsDeleted; } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { int uriType = URI_MATCHER.match(uri); SQLiteDatabase writableDatabase = mDatabaseHelper.getWritableDatabase(); int rowsUpdated = 0; switch (uriType) { case DRAWINGS: rowsUpdated = writableDatabase.update(DrawingTable.TABLE_NAME, values, selection, selectionArgs); break; case DRAWING_ID: String id = uri.getLastPathSegment(); if (TextUtils.isEmpty(selection)) { rowsUpdated = writableDatabase.update(DrawingTable.TABLE_NAME, values, DrawingContract.Columns.COLUMN_ID + "=" + id, null); } else { rowsUpdated = writableDatabase.update(DrawingTable.TABLE_NAME, values, DrawingContract.Columns.COLUMN_ID + "=" + id + " and " + selection, selectionArgs); } break; default: throw new IllegalArgumentException("Unknown uri: " + uri); } getContext().getContentResolver().notifyChange(uri, null); return rowsUpdated; } }