如何找出在 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