问题描述
时,sqlite Exception没有此类列
我有以下数据库帮助程序类:
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为整数(346742)时,此方法工作正常,但每当我尝试添加字母数字ID(PB3874)时,它都会强制关闭应用程序。
错误:
06-13 18:22:20.554:错误/ AndroidRuntime(8088):android.database.sqlite.sqliteException:无此类列:pb3874:,编译时:从用户表中选择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
,因为我试图从研究的列中简单地选择该值。以及为什么这对于任何int值都能完美地工作。有人有解决问题的建议吗?
解决方法
这里发生的是SQLite认为\ pb3874 \实际上是列名,而不是字符串/文本文字。
要指定它是文本文字,您需要确保将文本值包装在适当的单引号中:
为了防止SQL注入攻击,每当您从用户那里获取输入时,请使用参数化查询:
(\"select count(*) from usertable where \" + KEY_STUDID + \"=?\",studid);
没有参数化(在接受用户输入时非常不鼓励):
(\"select count(*) from usertable where \" + KEY_STUDID + \"=\'\" + studid + \"\'\",null);
您的数值不产生此值的原因:SQLite为您转换了这些数字文字。
, 如果要在SQL字符串中包含\'pb3874 \'(单引号),则需要用双引号引起来。
, 我认为您可以从Antlersoft或p.campbell那里找到问题的答案,以正确设置查询的格式,我建议您这样做:
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\'
, 数据库更新中触发了触发器错误