我的問題涉及Android中的SQLite數據庫。如何找出在Android中發送到SQLite的查詢?
當我使用像
cursor c = databaseHelper.rawQuery("SELECT " +user_id+" from "+DATABASE_TABLE,new String [] {});
我怎樣才能找出查詢語句被髮送到數據庫?
有沒有什麼辦法在Logcat中打印查詢?
我的問題涉及Android中的SQLite數據庫。如何找出在Android中發送到SQLite的查詢?
當我使用像
cursor c = databaseHelper.rawQuery("SELECT " +user_id+" from "+DATABASE_TABLE,new String [] {});
我怎樣才能找出查詢語句被髮送到數據庫?
有沒有什麼辦法在Logcat中打印查詢?
雖然其他人提到在調用databaseHelper.rawQuery
之前手動記錄查詢,但該方法的一個主要問題是需要在調用站點進行修改,在調用方法的任何地方添加日誌記錄語句。
我還沒有在Android上工作,但對於記錄查詢完全相同的問題,我使用AspectJ
取得了巨大成功。快速搜索並瀏覽一下android-aspectj就可以看出這個組合的作用。
總的來說,這似乎是主要的橫切用例,AspectJ
將是最好的方法。
如果你願意,你可以登錄它。 Log.d(「Query」,「youQuery」);
這是怎麼回事?
String query = "SELECT " +user_id+" from "+DATABASE_TABLE;
Log.d("SQL_QUERY", query);
cursor c = databaseHelper.rawQuery(query,new String [] {});
當然,最好是擴展類和重寫方法。
一個方面是絕對要走的路。但是,對於這個特殊用例,我會做一些更加自定義的事情,比如擴展您的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());
}
}
記住更新從清單中的鏈接。
什麼是ContentProvider? –
那麼,您首先要查詢的內容提供商。這是特定於Android的 – espinchi
並非Android中的所有數據庫訪問都使用內容提供者。問題中的那個沒有。 –
我不認爲有其他方式手動記錄它。 – Avinash