我有以下数据库助手类:
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)时,它都会强制关闭应用程序。
Error:
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
因为我试图简单地从 Studid 列中选择该值。以及为什么这对于任何 int 值都适用。有人有任何解决问题的建议吗?
这里发生的情况是,SQLite 认为“pb3874”实际上是一个列名,而不是字符串/文本文字。
要指定它是文本文字,您需要确保文本值包含在适当的单引号中:
为了防止 SQL 注入攻击,每当您从用户获取输入时,请使用参数化查询:
("select count(*) from usertable where " + KEY_STUDID + "=?", studid);
没有参数化(在接受用户输入时非常不鼓励):
("select count(*) from usertable where " + KEY_STUDID + "='" + studid + "'", null);
你的数值没有产生这个的原因是:SQLite 为你转换了这些数字文字。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)