Android中SQLite数据库中query或者rawquery查询失败闪退问题
16lz
2021-01-23
最近在学Android,在使用SQLite数据库的时候,出现了一个问题就是:
先说说我要实现功能: 查找数据库中是否有某个用户和密码。
最开始我是用的rawquery查询数据,看代码
查询:
Cursor cursor = db.rawQuery("select * from usertable where stuname=? and password = ?", values);
判断是否相等:
{ if (cursor.getString(cursor.getColumnIndex("password")).equals(psw))//密码相同 { Toast.makeText(MainActivity.this, "登录成功", Toast.LENGTH_LONG).show(); } else { Toast.makeText(MainActivity.this, "密码错误", Toast.LENGTH_LONG).show(); } Toast.makeText(MainActivity.this,"用户查找成功",Toast.LENGTH_LONG).show(); } else if(cursor.getCount()<=0) { Toast.makeText(MainActivity.this, "没有查到该用户", Toast.LENGTH_LONG).show(); } cursor.close();*/ }});
出现问题: 就是当输入正确的用户和密码时,可以正常显示;但是当密码或用户不匹配,就会出现闪退。
原因: 就是查询语句查询结果返回给cursor,但是查询失败的话,就直接闪退。无论你后面怎么判断,在这一步出错了,后面怎么弄都没用。
解决: 用query或者rawquery,查询所有数据,然后再对所有的数据进行判断。看代码
cursor=db.query("usertable",null,null,null,null,null,null);//cursor是游标,query查询返回的结果cursor.moveToFirst();//把游标异动到开头while(1==1){ if(cursor.getString(cursor.getColumnIndex("stuname")).equals(name)) //查找到用户名 { Toast.makeText(MainActivity.this,"用户查找成功",Toast.LENGTH_LONG).show(); if(cursor.getString(cursor.getColumnIndex("password")).equals(psw)) //密码相同 { Toast.makeText(MainActivity.this, "登录成功", Toast.LENGTH_LONG).show(); break; } else //密码不同 { Toast.makeText(MainActivity.this, "密码错误", Toast.LENGTH_LONG).show(); break; } } if(cursor.isLast())//当游标到最后时,说明没有查到该数据 { Toast.makeText(MainActivity.this, "无效用户,请注册", Toast.LENGTH_LONG).show(); break; } cursor.moveToNext();}
总结: query或则rawquery,查询失败,会闪退。解决方法:可以查询出所有内容,然后进行判断等操作。用moveToNext()不断的将游标后移,用isLast()方法判断是否到最后,到最后还是没有查到说明就没有该数据。
注意:具体的query怎么用可以看其他的大神的。