我有以下数据库助手类:
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值。任何人有任何解决建议的问题吗?
答案 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)
select * from bio where email = 'sasas'
答案 4 :(得分:0)
在数据库更新中触发触发器时出错