Я хочу восстановить пароль из базы данных с соответствующим именем пользователя, но я не могу это сделать - PullRequest
0 голосов
/ 11 июня 2019

Я в основном хочу использовать запрос выбора пароля из 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

1 Ответ

1 голос
/ 12 июня 2019

Причина, по которой вы выводите индекс за границы, заключается в том, что вы пытаетесь прочитать данные с позиции, которая ДО ПЕРВОЙ СТРОКИ т.е. -1. Вы должны переместить в строку, чтобы прочитать данные из строки.

Таким образом, перед строкой String check=res.getString(2); вам нужно перейти к строке, вероятно, используя метод Cursor's moveToFirst (хотя согласно сообщению возвращаются 2 строки, что является проблемой, которую вы, вероятно, захотите для адресации, как может показаться, что есть две строки для одного пользователя и, возможно, 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
        }
    });
}
...