package com.meg7.soas.database.provider; import android.content.ContentProvider; import android.content.ContentResolver; 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 com.meg7.soas.database.DatabaseHelper; import com.meg7.soas.database.OfflineNotesDataSource; import java.util.Arrays; import java.util.HashSet; /** * This class provides the ability to query the offline notes database. */ public class OfflineNotesProvider extends ContentProvider { // Used for the UriMatcher. private static final int OFFLINE_NOTES = 1; private static final int OFFLINE_NOTE_ID = 2; private static final String BASE_PATH = "offline_notes"; public static final Uri CONTENT_URI = Uri.parse("content://" + ProviderConstants.AUTHORITY_OFFLINE_NOTES + "/" + BASE_PATH); public static final String CONTENT_TYPE = ContentResolver.CURSOR_DIR_BASE_TYPE + "/offline_notes"; public static final String CONTENT_ITEM_TYPE = ContentResolver.CURSOR_ITEM_BASE_TYPE + "/offline_note"; private static final UriMatcher sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH); static { sUriMatcher.addURI(ProviderConstants.AUTHORITY_OFFLINE_NOTES, BASE_PATH, OFFLINE_NOTES); sUriMatcher.addURI(ProviderConstants.AUTHORITY_OFFLINE_NOTES, BASE_PATH + "/#", OFFLINE_NOTE_ID); } // Database helper. private DatabaseHelper mDatabaseHelper; @Override public boolean onCreate() { mDatabaseHelper = new DatabaseHelper(getContext()); return false; } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder(); // Make sure requested columns exist. checkColumns(projection); // Set table. queryBuilder.setTables(OfflineNotesDataSource.TABLE_NAME); int uriType = sUriMatcher.match(uri); switch (uriType) { case OFFLINE_NOTES: break; case OFFLINE_NOTE_ID: // Query by OfflineNote Id queryBuilder.appendWhere(OfflineNotesDataSource.COLUMN_ID + "=" + uri.getLastPathSegment()); break; default: throw new IllegalArgumentException("Unknown URI: " + uri); } SQLiteDatabase database = mDatabaseHelper.getWritableDatabase(); Cursor cursor = queryBuilder.query(database, projection, selection, selectionArgs, null, null, sortOrder); // Register to watch a content URI for changes. cursor.setNotificationUri(getContext().getContentResolver(), uri); return cursor; } @Override public Uri insert(Uri uri, ContentValues values) { int uriType = sUriMatcher.match(uri); SQLiteDatabase database = mDatabaseHelper.getWritableDatabase(); long id; switch (uriType) { case OFFLINE_NOTES: id = database.insert(OfflineNotesDataSource.TABLE_NAME, null, values); break; default: throw new IllegalArgumentException("Unknown URI: " + uri); } // Notify registered observers that a row was updated. getContext().getContentResolver().notifyChange(uri, null); return Uri.parse(BASE_PATH + "/" + id); } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { int uriType = sUriMatcher.match(uri); SQLiteDatabase database = mDatabaseHelper.getWritableDatabase(); int rowsDeleted; switch (uriType) { case OFFLINE_NOTES: rowsDeleted = database.delete(OfflineNotesDataSource.TABLE_NAME, selection, selectionArgs); break; case OFFLINE_NOTE_ID: String id = uri.getLastPathSegment(); if (TextUtils.isEmpty(selection)) { rowsDeleted = database.delete(OfflineNotesDataSource.TABLE_NAME, OfflineNotesDataSource.COLUMN_ID + "=" + id, null); } else { rowsDeleted = database.delete(OfflineNotesDataSource.TABLE_NAME, OfflineNotesDataSource.COLUMN_ID + "=" + id + " and " + selection, selectionArgs); } break; default: throw new IllegalArgumentException("Unknown URI: " + uri); } // Notify registered observers that a row was deleted. getContext().getContentResolver().notifyChange(uri, null); return rowsDeleted; } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { int uriType = sUriMatcher.match(uri); SQLiteDatabase database = mDatabaseHelper.getWritableDatabase(); int rowsUpdated; switch (uriType) { case OFFLINE_NOTES: rowsUpdated = database.update(OfflineNotesDataSource.TABLE_NAME, values, selection, selectionArgs); break; case OFFLINE_NOTE_ID: String id = uri.getLastPathSegment(); if (TextUtils.isEmpty(selection)) { rowsUpdated = database.update(OfflineNotesDataSource.TABLE_NAME, values, OfflineNotesDataSource.COLUMN_ID + "=" + id, null); } else { rowsUpdated = database.update(OfflineNotesDataSource.TABLE_NAME, values, OfflineNotesDataSource.COLUMN_ID + "=" + id + " and " + selection, selectionArgs); } break; default: throw new IllegalArgumentException("Unknown URI: " + uri); } // Notify registered observers that a row was updated. getContext().getContentResolver().notifyChange(uri, null); return rowsUpdated; } @Override public String getType(Uri uri) { switch (sUriMatcher.match(uri)){ // Get all OfflineNote records. case OFFLINE_NOTES: return "vnd.android.cursor.dir/offline_notes"; // Get a particular OfflineNote. case OFFLINE_NOTE_ID: return "vnd.android.cursor.item/offline_notes"; default: throw new IllegalArgumentException("Unsupported URI: " + uri); } } private void checkColumns(String[] projection) { String[] available = {OfflineNotesDataSource.COLUMN_PHOTO_ID, OfflineNotesDataSource.COLUMN_NOTE, OfflineNotesDataSource.COLUMN_ID}; if (projection != null) { HashSet<String> requestedColumns = new HashSet<String>(Arrays.asList(projection)); HashSet<String> availableColumns = new HashSet<String>(Arrays.asList(available)); // Check if all columns which are requested are available. if (!availableColumns.containsAll(requestedColumns)) { throw new IllegalArgumentException("Unknown columns in projection"); } } } }