SQLite异常在尝试选择时没有这样的列

时间:2011-06-13 22:47:41

标签: android sqlite

我有以下数据库助手类:

public int studentExists(String studid) {
    Cursor dataCount = mDb.rawQuery("select count(*) from usertable where " + KEY_STUDID + "=" + studid, null);
    dataCount.moveToFirst();
    int count = dataCount.getInt(0);
    dataCount.close();
    return count;
}

我在我的应用中使用此功能来查看之前是否输入了学生ID。

当学生ID为整数时(346742),这样可以正常工作,但每当我尝试添加字母数字ID(PB3874)时,它会强制关闭应用程序。

错误:

  

06-13 18:22:20.554:ERROR / AndroidRuntime(8088):android.database.sqlite.SQLiteException:没有这样的列:pb3874 :,编译时:从usertable中选择count(*),其中studid = pb3874

我认为它不是数据类型问题(因为我使用的是文本类型):

    private static final String DATABASE_CREATE =
    "create table usertable (_id integer primary key autoincrement, "
    + "studid text not null);";

但是我很困惑为什么错误是no such column: pb3874,因为我试图从studid列中简单地选择该值。以及为什么这适用于任何int值。任何人有任何解决建议的问题吗?

5 个答案:

答案 0 :(得分:63)

这里发生的是SQLite认为'pb3874'实际上是一个列名,而不是一个字符串/文本文字。

要指定它是文本文字,您需要确保将文本值包装在适当的单引号中:

为了防止SQL注入攻击,每当您从用户那里获取输入时,请使用参数化查询:

("select count(*) from usertable where " + KEY_STUDID + "=?", studid);

没有参数化(在接受用户输入时非常不鼓励):

("select count(*) from usertable where " + KEY_STUDID + "='" + studid + "'", null);  

你的数值没有产生这个的原因:SQLite为你转换了那些数字文字。

答案 1 :(得分:6)

如果要将它包含在SQL字符串中,则需要引用“pb3874”(单引号)。

答案 2 :(得分:2)

我认为你得到了Antlersoft或p.campbell的错误答案,正确格式化查询,我建议你这样做:

mDb.rawQuery("select count(*) from usertable where " + KEY_STUDID + "=?", studid);

应该(1)解决您的问题,(2)保护您免受SQL注入

另外,我不确定

dataCount.getInt(0);

是最好的事情......您应该使用getColumnIndex来确保获得正确的数据......

答案 3 :(得分:0)

对于STRING,你应该把它放在''('sasas')

之间
select * from bio where email = 'sasas'

答案 4 :(得分:0)

在数据库更新中触发触发器时出错