了解SQLite游标行为

时间:2012-12-06 18:55:18

标签: android 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,msg =没有这样的列:lastPlayer

为什么说没有这样的 lastPlayer?我以为我告诉查询查看“SETTING_COLUMN”列并返回该列的值为“lastPlayer”的记录。我糊涂了。有人能把我拉直吗?我一直在寻找一个小时,我只是看不出我做错了什么。

谢谢!

1 个答案:

答案 0 :(得分:2)

您没有正确构建/转发查询。由于值lastPlayer不在引号中,因此您的语句正在检查两列的相等性,这就是该错误消息所说的内容。

要正确构建查询,最好不要使用字符串连接手动执行此操作。相反,SQLiteDatabase.query()的参数selectionArgs意味着这样做。

您的查询中的参数应定义为?,然后根据selectionArgs填写。来自文档:

  

您可以在选择中包含?,它将被值替换   来自selectionArgs,以便它们出现在选择中。该   值将绑定为字符串。

所以,你的代码看起来像这样:

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