package org.francho.unutopia.mycontenterprovider.data;
import org.francho.unutopia.mycontenterprovider.data.MembersContract.UsersTable;
import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.text.TextUtils;
public class MyContentProvider extends ContentProvider {
private MyDbHelper mDbHelper;
private static final UriMatcher sUriMatcher;
private static final int TYPE_USERS_COLLECTION = 1;
private static final int TYPE_USERS_ITEM = 2;
static {
sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
sUriMatcher.addURI(MembersContract.AUTHORITY, "users", TYPE_USERS_COLLECTION);
sUriMatcher.addURI(MembersContract.AUTHORITY, "users/#", TYPE_USERS_ITEM);
}
@Override
public boolean onCreate() {
mDbHelper = new MyDbHelper(getContext());
return true;
}
@Override
public String getType(Uri uri) {
switch(sUriMatcher.match(uri)) {
case TYPE_USERS_COLLECTION:
return "android.cursor.dir/vnd.org.francho.unutopia.mycontentprovider.users";
case TYPE_USERS_ITEM:
return "android.cursor.item/vnd.org.francho.unutopia.mycontentprovider.users";
default:
return null;
}
}
/**
* Elimina registros de la base de datos. En caso de recibir una uri de tipo coleccion, elimina segun
* la condicion en el parametro selection. Si se recibe una uri de tipo item, eliminamos segun selection y el
* item indicado.
* por seguridad, en las uri de tipo colecci�n no se deja borrar si el parametro selection esta vacio. Para borrar
* todos los registros de una tabla se debe pasar en la selection un registro que siempre sea cierto, como "1=1"
*
* @return n�mero de registros afectados por la sentencia o -1 si no se ha realizado el borrado de datos.
*/
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
int result = -1;
SQLiteDatabase db = mDbHelper.getWritableDatabase();
// actuamos segun si la uri lleva incorporado el id del registro a eliminar o no.
switch (sUriMatcher.match (uri)) {
case TYPE_USERS_ITEM :
// recuperamos el id a eliminar
String id = uri.getLastPathSegment ();
if (TextUtils.isEmpty (selection)) {
selection = UsersTable._ID + " = " + id;
} else {
// hay clausula adicional. a�adimos esta condicion.
selection = " (" + selection + ") AND " + UsersTable._ID + " = " + id;
}
// lanzamos la sentencia delete
result = db.delete (UsersTable.TABLE_NAME, selection, selectionArgs);
break;
case TYPE_USERS_COLLECTION :
// si no viene condicion en el seleccion, abortamos la operacion para evitar que se elimine toda la tabla
// seguria siedo posible el vaciado pasando como selection "1=1";
if (TextUtils.isEmpty (selection)) {
result = -1;
} else {
result = db.delete (UsersTable.TABLE_NAME, selection, selectionArgs);
}
break;
default :
result = -1;
}
return result;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
int uriType = sUriMatcher.match(uri);
if( uriType != TYPE_USERS_COLLECTION) {
return null;
}
final SQLiteDatabase db = mDbHelper.getWritableDatabase();
long id = db.insert(UsersTable.TABLE_NAME, null, values);
Uri newUri = UsersTable.getUri(id);
return newUri;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
final SQLiteDatabase db = mDbHelper.getReadableDatabase();
switch(sUriMatcher.match(uri)) {
case TYPE_USERS_ITEM:
String id = uri.getLastPathSegment();
if(!TextUtils.isEmpty(selection)) {
selection += " AND";
} else {
selection = "";
}
selection += UsersTable._ID + "==" + id;
String table = UsersTable.TABLE_NAME;
String groupBy = null;
String having = null;
Cursor cursor = db.query(table, projection, selection, selectionArgs, groupBy, having, sortOrder);
return cursor;
default:
return null;
}
}
/**
* Actualiza la tabla de usuarios. Puede recibir una uri de tipo Coleccion o de tipo Item. en el primer caso
* actualiza todos los registros afectados por la condicion indicada en el parametro selection. En caso de ser
* una uri de tipo Item, se a�ade a la condici�n que el _ID del registro sea el indicado.
*
* @return numero de registros actualizados. -1 en caso de error.
*/
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
int result = -1;
// accedemos a la base de datos
final SQLiteDatabase db = mDbHelper.getWritableDatabase();
// verificamos la consulta
switch (sUriMatcher.match(uri)) {
case TYPE_USERS_ITEM :
// recuperamos el id del ultimo parametro de la uri
String id = uri.getLastPathSegment ();
// verificamos si hay parametros en la seleccion.
if (TextUtils.isEmpty (selection)) {
selection = UsersTable._ID + " = " + id;
} else {
selection = "(" + selection + ") AND " + UsersTable._ID + " = " + id; }
// Realizamos el update
result = db.update(UsersTable.TABLE_NAME, values, selection, selectionArgs);
break;
case TYPE_USERS_COLLECTION :
// lanzamos la actualizacion sin filtrar por id.
result = db.update(UsersTable.TABLE_NAME, values, selection, selectionArgs);
break;
default :
// en otro caso no se nos identifica el registro a actualizar y devolvemos -1;
result = -1;
}
return result;
}
}