2012-12-06 54 views
1

我在寫一個方法來更新表中的默認設置。該表格非常簡單:兩列,第一列包含用於指示設置類型的標籤,第二列用於存儲設置的值。瞭解SQLite光標行爲

在執行的這一點上,表格是空的。我只是設置了初始值。所以,我希望這個光標會回到空白。但是,我得到一個錯誤(如下所示)。我正在使用的設置稱爲「lastPlayer」,應該存儲在「SETTINGS_TABLE」的「SETTING_COLUMN」中。下面的代碼:

public static void updateSetting(String setting, String newVal) { 
    String table = "SETTINGS_TABLE"; 
    String[] resultColumn = new String[] {VALUE_COLUMN}; 
    String where = SETTING_COLUMN + "=" + setting; 
    System.err.println(where); 

    SQLiteDatabase db = godSimDBOpenHelper.getWritableDatabase(); 
    Cursor cursor = db.query(table, resultColumn, where, null, null, null, null); 
    System.err.println("cursor returned"); //I never see this ouput 

     \\more 
} 

sqlite的返回:錯誤碼= 1,味精=沒有這樣的列:lastPlayer

爲什麼說沒有這樣的 lastPlayer?我認爲我告訴查詢查看「SETTING_COLUMN」列並返回該列中值爲「lastPlayer」的記錄。我很困惑。有人能把我伸直嗎?我一直在尋找一個小時,我只是沒有看到我做錯了什麼。

謝謝!

+1

使用SharedPreferences是你的目的,更好的(和更復雜的使用)。 – Jong

+0

好的建議。我會研究它,並可能回到這一點。 – Alex

回答

2

您無法正確構建/轉義您的查詢。由於值lastPlayer未引號,因此您的語句正在檢查兩列的相等性,這是錯誤消息說的內容。

要正確構建您的查詢,最好不要使用String concatenation手動執行此操作。相反,SQLiteDatabase.query()的參數selectionArgs是爲了做到這一點。

查詢中的參數應定義爲?,然後根據selectionArgs填寫。從文檔:

您可以包括S IN的選擇,這將是由值 代替從selectionArgs兩個,以使他們出現在選擇? 值將被綁定爲字符串。

所以,你的代碼應該是這樣的:

String where = SETTING_COLUMN + " = ?"; 
Cursor cursor = db.query(table, resultColumn, where, new String[] { setting }, null, null, null); 
+0

就是這樣。學習了關於SQLite的新內容。謝謝! – Alex