package co.mwater.clientapp.dbsync;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteQueryBuilder;
import android.net.Uri;
import android.text.TextUtils;
import android.util.Log;
public class CRUDUriHandler extends UriHandler {
private static final String TAG = CRUDUriHandler.class.getCanonicalName();
SyncContentProvider syncContentProvider;
SyncDatabaseHelper helper;
SyncTable syncTable;
public CRUDUriHandler(SyncContentProvider syncContentProvider, SyncDatabaseHelper helper, SyncTable syncTable) {
this.syncContentProvider = syncContentProvider;
this.helper = helper;
this.syncTable = syncTable;
}
@Override
Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
// Using SQLiteQueryBuilder instead of query() method
SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder();
// Set the table
queryBuilder.setTables(syncTable.getTableName());
// Check for appended id
try {
long id = Long.parseLong(uri.getLastPathSegment());
// Add the ID to the original query
queryBuilder.appendWhere(SyncTable.COLUMN_ID + "=" + id);
} catch (NumberFormatException ex) {
}
SQLiteDatabase db = helper.getWritableDatabase();
Cursor cursor = queryBuilder.query(db, projection, selection, selectionArgs, null, null, sortOrder);
Log.d(TAG, String.format("query(%d): %s %s %s", cursor.getCount(), uri.toString(), selection, (selectionArgs != null && selectionArgs.length > 0) ? selectionArgs[0] : ""));
// Make sure that potential listeners are getting notified
cursor.setNotificationUri(syncContentProvider.getContext().getContentResolver(), uri);
return cursor;
}
@Override
Uri insert(Uri uri, ContentValues values) {
SQLiteDatabase db = helper.getWritableDatabase();
long id = db.insert(syncTable.getTableName(), null, values);
syncContentProvider.getContext().getContentResolver().notifyChange(uri, null);
return Uri.parse(uri + "/" + id);
}
@Override
int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
SQLiteDatabase db = helper.getWritableDatabase();
// Check for appended id
int rowsUpdated;
try {
long id = Long.parseLong(uri.getLastPathSegment());
if (TextUtils.isEmpty(selection)) {
rowsUpdated = db.update(syncTable.getTableName(), values, SyncTable.COLUMN_ID + "=" + id, null);
} else {
rowsUpdated = db.update(syncTable.getTableName(), values, SyncTable.COLUMN_ID + "=" + id + " AND " + selection, selectionArgs);
}
} catch (NumberFormatException ex) {
rowsUpdated = db.update(syncTable.getTableName(), values, selection, selectionArgs);
}
syncContentProvider.getContext().getContentResolver().notifyChange(uri, null);
return rowsUpdated;
}
@Override
int delete(Uri uri, String selection, String[] selectionArgs) {
SQLiteDatabase db = helper.getWritableDatabase();
// Check for appended id
int rowsDeleted;
try {
long id = Long.parseLong(uri.getLastPathSegment());
if (TextUtils.isEmpty(selection)) {
rowsDeleted = db.delete(syncTable.getTableName(), SyncTable.COLUMN_ID + "=" + id, null);
} else {
rowsDeleted = db.delete(syncTable.getTableName(), SyncTable.COLUMN_ID + "=" + id + " AND " + selection, selectionArgs);
}
} catch (NumberFormatException ex) {
rowsDeleted = db.delete(syncTable.getTableName(), selection, selectionArgs);
}
syncContentProvider.getContext().getContentResolver().notifyChange(uri, null);
return rowsDeleted;
}
}