2011-11-04 48 views
1

我的問題涉及Android中的SQLite數據庫。如何找出在Android中發送到SQLite的查詢?

當我使用像

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

我怎樣才能找出查詢語句被髮送到數據庫?
有沒有什麼辦法在Logcat中打印查詢?

+0

我不認爲有其他方式手動記錄它。 – Avinash

回答

2

雖然其他人提到在調用databaseHelper.rawQuery之前手動記錄查詢,但該方法的一個主要問題是需要在調用站點進行修改,在調用方法的任何地方添加日誌記錄語句。

我還沒有在Android上工作,但對於記錄查詢完全相同的問題,我使用AspectJ取得了巨大成功。快速搜索並瀏覽一下android-aspectj就可以看出這個組合的作用。

總的來說,這似乎是主要的橫切用例,AspectJ將是最好的方法。

1

如果你願意,你可以登錄它。 Log.d(「Query」,「youQuery」);

1

這是怎麼回事?

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

當然,最好是擴展類和重寫方法。

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()); 
    } 
} 

記住更新從清單中的鏈接。

+0

什麼是ContentProvider? –

+0

那麼,您首先要查詢的內容提供商。這是特定於Android的 – espinchi

+0

並非Android中的所有數據庫訪問都使用內容提供者。問題中的那個沒有。 –