我的问题与Android中的SQLite数据库有关。
当我使用像
这样的语句时cursor c = databaseHelper.rawQuery("SELECT " +user_id+" from "+DATABASE_TABLE,new String [] {});
如何查找发送到数据库的查询? 有没有办法在Logcat中打印查询?
答案 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());
}
}
请记住从清单中更新链接。