package com.dmitrymalkovich.android.xyzreader.data; import android.content.ContentProvider; import android.content.ContentProviderOperation; import android.content.ContentProviderResult; import android.content.ContentValues; import android.content.Context; import android.content.OperationApplicationException; import android.content.UriMatcher; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.net.Uri; import android.support.annotation.NonNull; import java.util.ArrayList; import java.util.List; public class ItemsProvider extends ContentProvider { private SQLiteOpenHelper mOpenHelper; private Context mContext; interface Tables { String ITEMS = "items"; } private static final int ITEMS = 0; private static final int ITEMS__ID = 1; private static final UriMatcher sUriMatcher = buildUriMatcher(); private static UriMatcher buildUriMatcher() { final UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH); final String authority = ItemsContract.CONTENT_AUTHORITY; matcher.addURI(authority, "items", ITEMS); matcher.addURI(authority, "items/#", ITEMS__ID); return matcher; } @Override public boolean onCreate() { mOpenHelper = new ItemsDatabase(getContext()); mContext = getContext(); return true; } @Override public String getType(@NonNull Uri uri) { final int match = sUriMatcher.match(uri); switch (match) { case ITEMS: return ItemsContract.Items.CONTENT_TYPE; case ITEMS__ID: return ItemsContract.Items.CONTENT_ITEM_TYPE; default: throw new UnsupportedOperationException("Unknown uri: " + uri); } } @Override public Cursor query(@NonNull Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { final SQLiteDatabase db = mOpenHelper.getReadableDatabase(); final SelectionBuilder builder = buildSelection(uri); Cursor cursor = builder.where(selection, selectionArgs).query(db, projection, sortOrder); if (cursor != null) { cursor.setNotificationUri(mContext.getContentResolver(), uri); } return cursor; } @Override public Uri insert(@NonNull Uri uri, ContentValues values) { final SQLiteDatabase db = mOpenHelper.getWritableDatabase(); final int match = sUriMatcher.match(uri); switch (match) { case ITEMS: { final long _id = db.insertOrThrow(Tables.ITEMS, null, values); mContext.getContentResolver().notifyChange(uri, null); return ItemsContract.Items.buildItemUri(_id); } default: { throw new UnsupportedOperationException("Unknown uri: " + uri); } } } @Override public int update(@NonNull Uri uri, ContentValues values, String selection, String[] selectionArgs) { final SQLiteDatabase db = mOpenHelper.getWritableDatabase(); final SelectionBuilder builder = buildSelection(uri); mContext.getContentResolver().notifyChange(uri, null); return builder.where(selection, selectionArgs).update(db, values); } @Override public int delete(@NonNull Uri uri, String selection, String[] selectionArgs) { final SQLiteDatabase db = mOpenHelper.getWritableDatabase(); final SelectionBuilder builder = buildSelection(uri); mContext.getContentResolver().notifyChange(uri, null); return builder.where(selection, selectionArgs).delete(db); } private SelectionBuilder buildSelection(Uri uri) { final SelectionBuilder builder = new SelectionBuilder(); final int match = sUriMatcher.match(uri); return buildSelection(uri, match, builder); } private SelectionBuilder buildSelection(Uri uri, int match, SelectionBuilder builder) { final List<String> paths = uri.getPathSegments(); switch (match) { case ITEMS: { return builder.table(Tables.ITEMS); } case ITEMS__ID: { final String _id = paths.get(1); return builder.table(Tables.ITEMS).where(ItemsContract.Items._ID + "=?", _id); } default: { throw new UnsupportedOperationException("Unknown uri: " + uri); } } } /** * Apply the given set of {@link ContentProviderOperation}, executing inside * a {@link SQLiteDatabase} transaction. All changes will be rolled back if * any single one fails. */ @NonNull public ContentProviderResult[] applyBatch(@NonNull ArrayList<ContentProviderOperation> operations) throws OperationApplicationException { final SQLiteDatabase db = mOpenHelper.getWritableDatabase(); db.beginTransaction(); try { final int numOperations = operations.size(); final ContentProviderResult[] results = new ContentProviderResult[numOperations]; for (int i = 0; i < numOperations; i++) { results[i] = operations.get(i).apply(this, results, i); } db.setTransactionSuccessful(); return results; } finally { db.endTransaction(); } } }