我有以下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;
}
Run Code Online (Sandbox Code Playgroud)
我在我的应用程序中使用此功能来查看之前是否已输入学生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);";
Run Code Online (Sandbox Code Playgroud)
但我很困惑为什么错误说,no such column: pb3874因为我试图从studid列中简单地选择该值.以及为什么这适用于任何int值.任何人有任何解决建议的问题?
p.c*_*ell 65
这里发生的是SQLite认为'pb3874'实际上是一个列名,而不是一个字符串/文本文字.
要指定它是文本文字,您需要确保将文本值包装在适当的单引号中:
要防止SQL注入攻击,每当您从用户那里获取输入时,请使用参数化查询:
("select count(*) from usertable where " + KEY_STUDID + "=?", studid);
Run Code Online (Sandbox Code Playgroud)
没有参数化(在用户输入时非常气馁):
("select count(*) from usertable where " + KEY_STUDID + "='" + studid + "'", null);
Run Code Online (Sandbox Code Playgroud)
您的数值不会产生这种情况的原因:SQLite为您转换了这些数字文字.