package com.mobidev.newsapp.database;
import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.Context;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.util.Log;
import com.mobidev.newsapp.utils.SelectionBuilder;
public class AppProvider extends ContentProvider {
private static final String DEBUG_TAG = "AppProvider";
private DataBaseHelper dbHelper;
private static final int NEWS = 100;
private static final int NEWS_ID = 110;
private static final UriMatcher sUriMatcher = buildUriMatcher();
@Override
public boolean onCreate() {
dbHelper = new DataBaseHelper(getContext());
return true;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
final SQLiteDatabase db = dbHelper.getReadableDatabase();
final int match = sUriMatcher.match(uri);
switch (match) {
default: {
final SelectionBuilder builder = buildExpandedSelection(uri, match);
Cursor cursor = builder.where(selection, selectionArgs).query(db,
false, projection, sortOrder, null);
Context context = getContext();
if (null != context) {
cursor.setNotificationUri(context.getContentResolver(), uri);
}
return cursor;
}
}
}
@Override
public String getType(Uri uri) {
// TODO Auto-generated method stub
return null;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
Log.v(DEBUG_TAG, "insert(uri=" + uri + ", values=" + values.toString());
final int match = sUriMatcher.match(uri);
switch (match) {
case NEWS: {
db.insertOrThrow(DataBaseHelper.Tables.NEWS, null, values);
getContext().getContentResolver().notifyChange(uri, null);
return AppContract.News.buildPostUri(values.getAsString(AppContract.News.NEWS_ID));
}
default: {
throw new UnsupportedOperationException("Unknown insert uri: "
+ uri);
}
}
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
// TODO Auto-generated method stub
return 0;
}
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
return 0;
}
private SelectionBuilder buildExpandedSelection(Uri uri, int match) {
final SelectionBuilder builder = new SelectionBuilder();
switch (match) {
case NEWS: {
return builder.table(DataBaseHelper.Tables.NEWS);
}
case NEWS_ID: {
final String newsId = AppContract.News.getNewsId(uri);
return builder.table(DataBaseHelper.Tables.NEWS).where(AppContract.News._ID + "=?", newsId);
}
default: {
throw new UnsupportedOperationException("Unknown uri: " + uri);
}
}
}
/**
* Build and return a {@link android.content.UriMatcher} that catches all {@link android.net.Uri}
* variations supported by this {@link android.content.ContentProvider}.
*/
private static UriMatcher buildUriMatcher() {
final UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);
final String authority = AppContract.CONTENT_AUTHORITY;
matcher.addURI(authority, "news", NEWS);
matcher.addURI(authority, "news/*", NEWS_ID);
return matcher;
}
}