2012-12-06 56 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