最近在学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怎么用可以看其他的大神的。