SQLiteexception没有这样的列当试图select

我有以下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; } 

我在我的应用程序中使用它来查看是否以前input过学生ID。

这个工作正常,当学生的ID是整数(346742),但每当我尝试添加一个字母数字编号(PB3874)强制closures应用程序。

错误:

06-13 18:22:20.554:错误/ AndroidRuntime(8088):android.database.sqlite.SQLiteException:没有这样的列:pb3874:,编译时:从usertable select count(*)where studid = pb3874

我不认为它是一个数据types问题(因为我使用文本types):

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

但我很困惑,为什么错误是说no such column: pb3874因为我试图从studid列中简单地select该值。 此外,为什么这对任何int值完美的作品。 任何人有任何解决问题的build议?

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

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

为防止SQL注入攻击,无论何时从用户处获取input,都使用参数化查询:

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

没有参数化(当用户input时非常不鼓励):

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

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

如果将其包含在SQLstring中,则需要引用“pb3874”(单引号)。

我想你已经从Antlersoft或者p.campbell中得到了答案,为了正确地格式化查询,我build议你这样做:

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

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

另外,我不确定

 dataCount.getInt(0); 

是最好的事情…你应该使用getColumnIndex来确保你得到正确的数据…

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

 select * from bio where email = 'sasas'