尝试选择

问题描述

时,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\'
    ,        数据库更新中触发了触发器错误