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

bMo*_*Mon 26 sqlite android

我有以下DB帮助程序类:

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;
}
Run Code Online (Sandbox Code Playgroud)

我在我的应用程序中使用此功能来查看之前是否已输入学生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);";
Run Code Online (Sandbox Code Playgroud)

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

p.c*_*ell 65

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

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

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

("select count(*) from usertable where " + KEY_STUDID + "=?", studid);
Run Code Online (Sandbox Code Playgroud)

没有参数化(在用户输入时非常气馁):

("select count(*) from usertable where " + KEY_STUDID + "='" + studid + "'", null);  
Run Code Online (Sandbox Code Playgroud)

您的数值不会产生这种情况的原因:SQLite为您转换了这些数字文字.


ant*_*oft 6

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