如何找出在Android中发送到SQLite的查询?

时间:2011-11-04 07:43:06

标签: java android sqlite logcat

我的问题与Android中的SQLite数据库有关。

当我使用像

这样的语句时
cursor c = databaseHelper.rawQuery("SELECT " +user_id+" from "+DATABASE_TABLE,new String [] {});

如何查找发送到数据库的查询? 有没有办法在Logcat中打印查询?

4 个答案:

答案 0 :(得分:2)

虽然其他人提到在调用databaseHelper.rawQuery之前手动记录查询,但该方法的一个大问题是在调用站点需要修改,在调用该方法的任何地方添加日志记录语句。

我没有在Android上工作,但对于完全相同的日志记录查询问题,我使用AspectJ取得了巨大成功。快速搜索并浏览android-aspectj表明该组合有效。

总的来说,这似乎是主要的交叉用例,而AspectJ将是最好的方法。

答案 1 :(得分:1)

如果您愿意,可以对其进行logcat。 Log.d(“查询”,“youQuery”);

答案 2 :(得分:1)

这个怎么样?

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

当然,最好扩展class和override方法。

答案 3 :(得分:0)

方面肯定是要走的路。但是,对于这个特定的用例,我会做一些更自定义的事情,例如扩展你的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()); 
    }
}

请记住从清单中更新链接。