package com.ericliudeveloper.sharedbillhelper.model;
import android.content.AsyncQueryHandler;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.Handler;
import android.os.Message;
import com.ericliudeveloper.sharedbillhelper.database.DatabaseConstants;
import com.ericliudeveloper.sharedbillhelper.provider.BillContract;
/**
* Created by liu on 7/06/15.
*/
public class BillDAO implements Dao {
// static ContentResolver mContentResolver = MyApplication.getAppContentResolver();
static String[] projection = BillContract.Bills.PROJECTION;
static Uri billsUri = BillContract.Bills.CONTENT_URI;
public BillDAO() {
}
/**
* retrieve a Bill Object from DB and return it by using Handler to send a Message
*
* @param id
* @param handler
*/
public static void getBill(long id, final Handler handler) {
Uri uri = BillContract.Bills.buildBillUri(String.valueOf(id));
// Cursor cursor = mContentResolver.query(uri, projection, null, null, null);
new AsyncQueryHandler(mContentResolver) {
@Override
protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
if (handler != null && cursor != null) {
Bill bill = getBillFromCursor(cursor);
Message message = Message.obtain();
message.what = MESSAGE_WHAT_GET_BILL;
message.obj = bill;
handler.sendMessage(message);
}
}
}.startQuery(0, null, uri, projection, null, null, null);
}
/**
* Create a Bill instance from a cursor, assumed the cursor is retrieved from DB thus id field is not null.
** Be careful: you must position the cursor before calling this method or it will throw CursorIndexOutOfBoundsException
* @param cursor
* @return
*/
public static Bill getBillFromCursor(Cursor cursor) {
if (cursor != null) {
long billId = cursor.getLong(cursor.getColumnIndexOrThrow(DatabaseConstants.BillColumns.COL_ROWID));
Bill bill = new Bill(billId);
bill.setType(cursor.getString(cursor.getColumnIndexOrThrow(DatabaseConstants.BillColumns.COL_TYPE)));
bill.setAmount(cursor.getDouble(cursor.getColumnIndexOrThrow(DatabaseConstants.BillColumns.COL_AMOUNT)));
bill.setStartDate(cursor.getString(cursor.getColumnIndexOrThrow(DatabaseConstants.BillColumns.COL_BILLING_START)));
bill.setEndDate(cursor.getString(cursor.getColumnIndexOrThrow(DatabaseConstants.BillColumns.COL_BILLING_END)));
bill.setDueDate(cursor.getString(cursor.getColumnIndexOrThrow(DatabaseConstants.BillColumns.COL_DUE_DATE)));
bill.setPaid(cursor.getInt(cursor.getColumnIndexOrThrow(DatabaseConstants.BillColumns.COL_PAID)));
return bill;
}
return null;
// don't close the cursor!
}
public static void saveBill(final Bill bill, final Handler handler) {
long id = bill.getId();
final ContentValues values = getContentValuesFromBillInstance(bill);
if (id >= 0) { // this is an update
final Uri billUriWithId = BillContract.Bills.buildBillUri(String.valueOf(id));
new AsyncQueryHandler(mContentResolver) {
}.startUpdate(0, null, billUriWithId, values, null, null);
return;
}
AsyncQueryHandler insertBillHandler = new AsyncQueryHandler(mContentResolver) {
@Override
protected void onInsertComplete(int token, Object cookie, Uri uri) {
if (handler != null) {
Message message = Message.obtain();
message.what = MESSAGE_WHAT_SAVED_BILL_URL;
message.obj = uri;
handler.sendMessage(message);
}
}
};
insertBillHandler.startInsert(0, null, billsUri, values);
}
/**
* Create ContentValues from a Bill Instance, the id field is ignored.
*
* @param bill
* @return
*/
public static ContentValues getContentValuesFromBillInstance(Bill bill) {
if (bill == null) {
return null;
}
ContentValues values = new ContentValues();
values.put(DatabaseConstants.BillColumns.COL_TYPE, bill.getType());
values.put(DatabaseConstants.BillColumns.COL_AMOUNT, bill.getAmount());
values.put(DatabaseConstants.BillColumns.COL_BILLING_START, bill.getStartDate());
values.put(DatabaseConstants.BillColumns.COL_BILLING_END, bill.getEndDate());
values.put(DatabaseConstants.BillColumns.COL_DUE_DATE, bill.getDueDate());
values.put(DatabaseConstants.BillColumns.COL_PAID, bill.getPaid());
values.put(DatabaseConstants.BillColumns.COL_DELETED, bill.getDeleted());
return values;
}
}