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'