Android中SQLite rawQuery()语法错误排查:登录验证功能异常
问题原因及解决方案
先看Logcat里输出的错误SQL语句:
SELECT * FROM registrationWHERE Email=? AND Password=?
一眼就能发现问题:你的表名registration和WHERE关键字直接连在一起了!SQLite解析时会把registrationWHERE当成一个不存在的表名,后面紧跟着=符号,自然就触发了syntax error near "="的语法错误。
错误根源
在checkusercredentials方法拼接SQL字符串时,TABLE_NAME和where之间少了一个空格:
c=db.rawQuery("select * from "+TABLE_NAME+"where " + "Email=? and Password=?",new String[]{email,password});
这段代码里的"+TABLE_NAME+"where "会被拼接成registrationwhere,没有空格分隔表名和WHERE子句,直接破坏了SQL的语法结构。
修复后的代码
只需要在TABLE_NAME和where之间补上一个空格即可:
public int checkusercredentials(String email,String password){ Log.i("INISDE","CHECK USER "); SQLiteDatabase db=this.getWritableDatabase(); try{ int i=0; Cursor c=null; // 给TABLE_NAME和where之间添加空格 c=db.rawQuery("select * from "+TABLE_NAME+" where Email=? and Password=?",new String[]{email,password}); c.moveToNext(); i=c.getCount(); c.close(); return i; }catch(Exception e) { e.printStackTrace(); } return 0; }
额外优化建议
- 处理Cursor前最好先判断
c != null,避免空指针异常; - 因为用户邮箱应该是唯一的,用
c.moveToFirst()代替moveToNext()逻辑会更清晰; - 建议在创建表时给
Email字段加上UNIQUE约束,防止重复注册同一邮箱,让查询结果更可靠。
内容的提问来源于stack exchange,提问作者WALEED AHMED
相关产品推荐
相关产品推荐

