我基本上想使用Login_table中的查询选择密码,其中username ='this will be given by the user';
Cursor res =db.rawQuery("select password from Login_table where username ='"+x+"'",null);
我猜这是对的,但仍然有问题
android.database.CursorIndexOutOfBoundsException:已请求索引-1, 大小为2
public void checkData(){
b1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String user_name=usname.getText().toString();
Cursor res =mydb.getData(user_name);
if(res.getCount()==0){
Toast.makeText(MainActivity.this,"Login failed",Toast.LENGTH_SHORT);
}
String check=res.getString(2);
Toast.makeText(MainActivity.this,String.valueOf(check),Toast.LENGTH_SHORT).show();
String pass_Word=pass.getText().toString();
if(pass_Word.compareTo(check)==0){
Toast.makeText(MainActivity.this,"You are Loged IN",Toast.LENGTH_LONG).show();
}
else
Toast.makeTextenter code here(MainActivity.this,"You are Not Loged IN",Toast.LENGTH_SHORT).show();
}
});
}
我只想获取密码并检查用户输入enter code here
答案 0 :(得分:1)
使索引超出范围的原因是,您尝试从第一行之前(即-1)的位置读取数据。您必须移动到行中才能从行中读取数据。
因此,在String check=res.getString(2);
行之前,您需要移至一行,可能使用Cursor的 moveToFirst 方法(尽管根据消息返回了两行,这是您遇到的问题)可能要解决,因为似乎同一用户有两行,也许还有2个不同的密码。
moveToFirst 方法返回一个布尔值, true ,如果可以进行移动,否则为false,则无需检查是否存在任何行好像没有,那么 moveToFirst 将返回false。
尽管目前可能不是问题。完成操作后,还应该始终关闭游标。
因此,您不妨尝试使用:-
public void checkData(){
final DBAssetHelper mydb;
b1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String user_name=usname.getText().toString();
Cursor res =mydb.getData(user_name);
if (res.moveToFirst()) { //<<<<<<<<<< try to move to a row
Toast.makeText(MainActivity.this,"Login failed", Toast.LENGTH_SHORT);
} else {
if (res.getString(2).equals(pass.getText().toString)) {
Toast.makeText(MainActivity.this,"You are Loged IN",Toast.LENGTH_LONG).show();
} else {
Toast.makeText(MainActivity.this,"You are Not Loged IN",Toast.LENGTH_SHORT).show();
}
}
res.close(); //<<<<<<<<<< Close the Cursor
}
});
}