Аспект, безусловно, путь. Но для этого конкретного варианта использования я хотел бы сделать что-то более нестандартное, например, расширить вашу ContentProvider
реализацию, а затем выполнить всю регистрацию в вашем подклассе.
В конце концов, это просто перехватчик, но это уродливо, потому что вы не можете использовать декоратор с композицией, поскольку ваш класс должен быть подклассом ContentProvider
.
Вот пример, если у вас уже есть провайдер с именем FooBarProvider
:
/**
* Content provider that just adds some logging to {@link FooBarProvider}.
*/
public class InstrumentedFooBarProvider extends FooBarProvider {
private static final String TAG = InstrumentedFooBarProvider.class.getSimpleName();
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
final Cursor returnValue = super.query(uri, projection, selection, selectionArgs, sortOrder);
Log.d(TAG, "QUERY on " + uri
+ " with selection " + selection
+ " (" + arrayToString(selectionArgs) + ")."
+ " Result: " + returnValue.getCount());
return returnValue;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
final Uri returnValue = super.insert(uri, values);
// TODO: analyze values properly
Log.d(TAG, "INSERT on " + uri
+ " with values " + values + "."
+ " Result: " + returnValue);
return returnValue;
}
@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
final int returnValue = super.update(uri, values, selection, selectionArgs);
// TODO: analyze values properly
Log.d(TAG, "UPDATE on " + uri
+ " with values " + values
+ " with selection " + selection
+ " (" + arrayToString(selectionArgs) + ")."
+ " Result: " + returnValue);
return returnValue;
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
final int returnValue = super.delete(uri, selection, selectionArgs);
Log.d(TAG, "Delete operation on " + uri +
" with " + selection
+ " (" + arrayToString(selectionArgs) + ")."
+ " Result: " + returnValue);
return returnValue;
}
@Override
public ContentProviderResult[] applyBatch(ArrayList<ContentProviderOperation> operations)
throws OperationApplicationException {
final ContentProviderResult[] returnValue = super.applyBatch(operations);
// TODO: analyze results properly
Log.d(TAG, "BATCH with " + operations.size() + " operations");
return returnValue;
}
private static Object arrayToString(Object[] array) {
return array == null ? "[]" : String.valueOf(Arrays.asList(array).toString());
}
}
Не забудьте обновить ссылку из манифеста.