package com.ericliudeveloper.sharedbillhelper.provider;
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 com.ericliudeveloper.sharedbillhelper.database.BillDatabaseHelper;
import com.ericliudeveloper.sharedbillhelper.database.DatabaseConstants;
public class BillProvider extends ContentProvider implements DatabaseConstants.TableAndView, DatabaseConstants.CommonColumns {
public static final String AUTH = BillContract.CONTENT_AUTHORITY;
// public static final Uri BILL_URI = Uri.parse("content://" + AUTH + "/bill");
// public static final Uri HOUSEMATE_URI = Uri.parse("content://" + AUTH
// + "/housemate");
// public static final Uri PAYMENT_URI = Uri.parse("content://" + AUTH
// + "/payment");
//
// public static final Uri PAYMENT_INFO_URI = Uri.parse("content://" + AUTH + "/paymentinfo");
public static final Uri DIALOG_BILL_URI = Uri.parse("content://" + AUTH + "/dialogbill");
public static final Uri DIALOG_MEMBER_URI = Uri.parse("content://" + AUTH + "/dialogmember");
public static final Uri PAYMENT_FULL_DETAIL = Uri.parse("content://" + AUTH + "/paymentfulldetail");
// Basic tables
private static final int BILLS = 1;
private static final int BILL_ID = 10;
private static final int HOUSEMATES = 2;
private static final int HOUSEMATE_ID = 20;
private static final int PAYMENTS = 3;
private static final int PAYMENT_ID = 30;
private static final int PAYMENT_INFO = 4;
private static final int PAYMENT_INFO_ID = 40;
private static final int DIALOG_BILL = 5;
private static final int DIALOG_MEMBER = 6;
private static final int PAYMENT_FULL = 7;
private static final UriMatcher URI_MATCHER;
static {
URI_MATCHER = new UriMatcher(UriMatcher.NO_MATCH);
URI_MATCHER.addURI(AUTH, BillContract.PATH_BILLS, BILLS);
URI_MATCHER.addURI(AUTH, BillContract.PATH_BILLS + "/#", BILL_ID);
URI_MATCHER.addURI(AUTH, BillContract.PATH_MEMBERS, HOUSEMATES);
URI_MATCHER.addURI(AUTH, BillContract.PATH_MEMBERS + "/#", HOUSEMATE_ID);
URI_MATCHER.addURI(AUTH, BillContract.PATH_PAYMENTS, PAYMENTS);
URI_MATCHER.addURI(AUTH, BillContract.PATH_PAYMENTS + "/#", PAYMENT_ID);
URI_MATCHER.addURI(AUTH, BillContract.PATH_PAYMENT_INFOS, PAYMENT_INFO);
URI_MATCHER.addURI(AUTH, BillContract.PATH_PAYMENT_INFOS + "/#", PAYMENT_INFO_ID);
URI_MATCHER.addURI(AUTH, "dialogbill", DIALOG_BILL);
URI_MATCHER.addURI(AUTH, "dialogmember", DIALOG_MEMBER);
URI_MATCHER.addURI(AUTH, "paymentfulldetail", PAYMENT_FULL);
}
private BillDatabaseHelper dbHelper;
@Override
public boolean onCreate() {
dbHelper = new BillDatabaseHelper(getContext());
return (dbHelper == null) ? false : true;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
final SQLiteDatabase db = dbHelper.getReadableDatabase();
int uriMatch = URI_MATCHER.match(uri);
final SelectionBuilder sb = new SelectionBuilder();
sb.where(selection, selectionArgs);
switch (uriMatch) {
case BILLS:
sb.table(VIEW_BILL);
break;
case BILL_ID:
sb.table(VIEW_BILL);
sb.where(COL_ROWID + "=?", uri.getLastPathSegment());
break;
case HOUSEMATES:
sb.table(VIEW_MEMBER);
break;
case HOUSEMATE_ID:
sb.table(VIEW_MEMBER).where(COL_ROWID + "=?", uri.getLastPathSegment());
break;
case PAYMENTS:
sb.table(TABLE_PAYMENT);
break;
case PAYMENT_ID:
sb.table(TABLE_PAYMENT).where(COL_ROWID + "=?", uri.getLastPathSegment());
break;
case PAYMENT_INFO:
sb.table(VIEW_PAYMENT_INFO);
break;
case PAYMENT_INFO_ID:
sb.table(VIEW_PAYMENT_INFO).where(COL_ROWID + "=?", uri.getLastPathSegment());
break;
case DIALOG_BILL:
sb.table(VIEW_BILL_NAME);
break;
case DIALOG_MEMBER:
sb.table(VIEW_MEMBER_NAME);
break;
case PAYMENT_FULL:
sb.table(VIEW_PAYMENT_FULL);
break;
default:
throw new IllegalArgumentException(" Unknow URL " + uri);
}
Cursor cursor = sb.query(db, projection, sortOrder);
// MUST NOT MISS this line or the CursorLoader won't be able to automatically reload.
cursor.setNotificationUri(getContext().getContentResolver(), uri);
return cursor;
}
@Override
public String getType(Uri uri) {
return null;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
long rowID = 0;
Uri newUri;
int uriMatch = URI_MATCHER.match(uri);
switch (uriMatch) {
case BILLS:
rowID = db.insert(TABLE_BILL, null, values);
newUri = ContentUris.withAppendedId(BillContract.Bills.CONTENT_URI, rowID);
break;
case HOUSEMATES:
rowID = db.insert(TABLE_MEMBER, null, values);
newUri = ContentUris.withAppendedId(BillContract.Members.CONTENT_URI, rowID);
break;
case PAYMENTS:
rowID = db.insert(TABLE_PAYMENT, null, values);
newUri = ContentUris.withAppendedId(BillContract.Payments.CONTENT_URI, rowID);
break;
case PAYMENT_INFO:
rowID = db.insert(TABLE_PAYMENT_INFO, null, values);
newUri = ContentUris.withAppendedId(BillContract.PaymentInfos.CONTENT_URI, rowID);
break;
default:
throw new IllegalArgumentException(" Unknow URL " + uri);
}
getContext().getContentResolver().notifyChange(uri, null);
return rowID >= 0 ? newUri : null;
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
SelectionBuilder sb = new SelectionBuilder();
getContext().getContentResolver().notifyChange(uri, null);
return 0;
}
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
SelectionBuilder sb = new SelectionBuilder();
sb.where(selection, selectionArgs);
String idString; // contains rowId
int count;
int uriMatch = URI_MATCHER.match(uri);
// String where;
// if (TextUtils.isEmpty(selection)) {
// where = "";
//
// }else {
// where = " AND ( " + selection + " )";
// }
switch (uriMatch) {
case BILL_ID:
idString = uri.getLastPathSegment();
count = sb.table(TABLE_BILL).where(COL_ROWID + "=?", idString).update(db, values);
break;
case HOUSEMATE_ID:
idString = uri.getLastPathSegment();
count = sb.table(TABLE_MEMBER).where(COL_ROWID + "=?", idString).update(db, values);
break;
case PAYMENT_ID:
idString = uri.getLastPathSegment();
count = sb.table(TABLE_PAYMENT).where(COL_ROWID + "=?", idString).update(db, values);
break;
case PAYMENT_INFO_ID:
idString = uri.getLastPathSegment();
count = sb.table(TABLE_PAYMENT_INFO).where(COL_ROWID + "=?", idString).update(db, values);
break;
case BILLS:
throw new IllegalArgumentException(" Bulk update not supported " + uri);
case HOUSEMATES:
throw new IllegalArgumentException(" Bulk update not supported " + uri);
case PAYMENTS:
throw new IllegalArgumentException(" Bulk update not supported " + uri);
case PAYMENT_INFO:
throw new IllegalArgumentException(" Bulk update not supported " + uri);
default:
throw new IllegalArgumentException(" Unknow URL " + uri);
}
getContext().getContentResolver().notifyChange(uri, null);
return count;
}
}