2011-12-31 100 views
0

我寫了下面的數據庫查詢。 但是,當我訪問顯示結果的列表活動時,應用程序崩潰。爲什麼我的查詢崩潰了?

我跟蹤誤差低於(其他簡單的查詢方式工作得很好)的方法:

public Cursor fetchInterface_HSE_Entries(String string) throws SQLException{ 
    String[] columns = new String[] {KEY_ROW_ID_INTERFACE, KEY_TEXTVIEW_VALUE, KEY_CATEGORY_OPTIONS, KEY_WORKSCREEN}; 
    String whereClause = KEY_WORKSCREEN+"=" + string; 
    Cursor cursor = db.query(TEXTVIEWS_TABLE, columns, whereClause, null, null, null, null); 

    if(cursor != null){ 
     cursor.moveToFirst(); 
    } 
    return cursor; 
} 

這是我的錯誤日誌的一部分:

12-31 16:13:38.851: E/AndroidRuntime(480): Caused by: android.database.sqlite.SQLiteException: no such column: testInterface1: , while compiling: SELECT _id, textviewvalue, categoryoptions, workscreen FROM interfacetable WHERE workscreen=testInterface1 

回答

1

與嘗試:

String whereClause = KEY_WORKSCREEN+"='" + string + "'"; 

您需要在查詢中引用文本值,否則它們將被解釋爲列名(或fu節點,或其他)。

請注意,這對於SQL注入攻擊是不安全的,您應該使用綁定變量。

String whereClause = KEY_WORKSCREEN+" = ?"; 
Cursor cursor = db.query(TEXTVIEWS_TABLE, columns, whereClause, 
         new String[]{string}, null, null, null); 
+0

感謝您警告我關於我的安全問題,我會研究它們,我非常喜歡Android,特別是使用數據庫,但盡我所能學習 – Eugen 2011-12-31 14:33:16

+0

Humm ...有人downvoted這,不知道爲什麼。也許有一個錯字或我錯過了什麼?尤金,如果你嘗試其中任何一個,請報告,如果工作或不,所以我可以更正(或刪除)這個答案? – Mat 2011-12-31 14:39:35

+0

是的,你的代碼工作得很好。非常感謝你的輸入, – Eugen 2011-12-31 14:43:57

1

因爲你不把引號放在whereClause的周圍。 嘗試:

String whereClause = KEY_WORKSCREEN+"='" + string + "'"; 

你可以清楚地看到你的錯誤日誌:

SELECT _id, textviewvalue, categoryoptions, workscreen FROM interfacetable WHERE workscreen=testInterface1 

應該是:

SELECT _id, textviewvalue, categoryoptions, workscreen FROM interfacetable WHERE workscreen='testInterface1' 
1
SELECT _id, textviewvalue, categoryoptions, workscreen FROM interfacetable WHERE workscreen=testInterface1 

由於錯誤說你沒有testInterface1 collumn做在接口表中,我認爲你的sql語句中應該有值而不是testInterface1。在db中運行你的查詢,你會看到相同的錯誤。

1

您需要將where子句中的字符串值放入引號中。

1

Workscren是字符串編輯您的查詢並添加單引號。 Key-workscreen +「=」'+ string +'「就像那樣