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

Posted

技术标签:

【中文标题】如何找出在 Android 中发送到 SQLite 的查询?【英文标题】:How to find out the query being sent into SQLite in Android? 【发布时间】:2011-11-04 07:43:05 【问题描述】:

我的问题是关于 android 中的 SQLite 数据库。

当我使用像

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

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

【问题讨论】:

我认为除了手动记录之外别无他法。 【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

如果你愿意,你可以登录它。 Log.d("查询", "youQuery");

【讨论】:

【参考方案3】:

这个怎么样?

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

当然,最好扩展类并覆盖方法。

【讨论】:

【参考方案4】:

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

记得更新清单中的链接。

【讨论】:

什么内容提供者? 嗯,首先是您查询的内容提供者。这是特定于 Android 的 并非所有 Android 中的数据库访问都使用内容提供程序。问题中的那个没有。

以上是关于如何找出在 Android 中发送到 SQLite 的查询?的主要内容,如果未能解决你的问题,请参考以下文章

Magento 2在结帐页面phtml中发送到支付网关之前获取订单ID?

*通过 *100 台相机在 1 中发送到 Instagram* 技巧*

无法识别的选择器“isSpringLoaded”在 XCode 6.3 中发送到 Xib 中的 NSButton

图片不会在我的 Alamofire .post 请求中发送到我的后端 - Swift 3

如何在android中发送电子邮件[重复]

如何在 Android 应用中发送电子邮件? [复制]