Как узнать, что запрос отправляется в SQLite в Android? - PullRequest
1 голос
/ 04 ноября 2011

Мой вопрос касается базы данных SQLite в Android.

Когда я использую оператор типа

cursor c = databaseHelper.rawQuery("SELECT " +user_id+" from "+DATABASE_TABLE,new String [] {});

Как я могу узнать, что запрос отправлен в базу данных?
Есть ли способ напечатать запрос в Logcat?

Ответы [ 4 ]

2 голосов
/ 04 ноября 2011

В то время как другие упоминали ручную регистрацию запроса перед вызовом databaseHelper.rawQuery, большая проблема этого подхода заключается в том, что на сайте вызова требуются изменения, добавляя операторы регистрации везде, где вызывается метод.

Я не работал на Android, но для той же самой проблемы регистрации запросов я использовал AspectJ с большим успехом. Быстрый поиск и взгляд на android-aspectj показывает, что комбинация работает.

В целом, это, пожалуй, лучший сквозной вариант использования, и AspectJ будет лучшим подходом.

1 голос
/ 04 ноября 2011

Как насчет этого?

String query = "SELECT " +user_id+" from "+DATABASE_TABLE;
Log.d("SQL_QUERY", query);
cursor c = databaseHelper.rawQuery(query,new String [] {});

Конечно, лучше расширить класс и переопределить методы.

1 голос
/ 04 ноября 2011

Вы можете войти, если хотите.Log.d ("Query", "youQuery");

0 голосов
/ 25 октября 2013

Аспект, безусловно, путь. Но для этого конкретного варианта использования я хотел бы сделать что-то более нестандартное, например, расширить вашу 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()); 
    }
}

Не забудьте обновить ссылку из манифеста.

...