Ошибка базы данных ArrayList outOfBoundsException - PullRequest
0 голосов
/ 26 ноября 2018

Эй, когда я запускал тесты для своего приложения, я начал удалять значения базы данных из моей базы данных.Как только я это сделал, я начал получать эту ошибку Caused by: java.lang.IndexOutOfBoundsException: Index: 0, Size: 0

Это для этой строки кода.PasswordResults passwordResults = password.get(0);, в котором я запутался, так как .get(0) всегда получит выбранную строку в моем recyclerView до того, как я удалю некоторые данные в базе данных.

Вот мой код для моего PasswordManager, куда я попадаюошибка при.Я передаю целочисленное значение проверки и строку, в которой есть selectedID строки, по которой щелкнул пользователь.Я пытался использовать PasswordResults passwordResults = password.get(Integer.parseInt(id)), думая, что это будет работать, но это не так.

// method to load correct screen based on user input.
    public void loadScreen(int c, String id){
        // checking if it is a previous entry.
        if(c == 1) {
            // Since there already is a password set button to "Show Password"
            password_btn.setText("Show");
            // getting selected passwords data.
            password = db.getSelectedPassword(id);

            // GETTING ERROR HERE
            PasswordResults passwordResults = password.get(0);

            idSelected = id;
            entryName_et.setText(passwordResults.entryName);
            website_et.setText(passwordResults.website);
            username_et.setText(passwordResults.username);

            realPassword = passwordResults.password;
            // dont show real password yet.
            if(showPW == 1)
                password_et.setText(realPassword);
             else 
                password_et.setText("***********");

            desc_et.setText(passwordResults.description);

            // make delete button visible since user could want to delete entry.
            delete_btn.setVisibility(View.VISIBLE);
        } else {
            // since user is creating a new entry dont show delete button.
            delete_btn.setVisibility(View.GONE);
        }
    }

Вот мой код для моего Database класса, который обрабатывает поиск информации в моей базе данных.

public void addPassword(String n, String w, String u, String p, String d) {
    // get database.
    SQLiteDatabase db = getWritableDatabase();

    try {
        // add scores.
        ContentValues values = new ContentValues();
        values.put(COLUMN_NAME, n);
        values.put(COLUMN_WEBSITE, w);
        values.put(COLUMN_USERNAME, u);
        values.put(COLUMN_PASSWORD, p);
        values.put(COLUMN_DESC, d);

        // insert will handle null values. closing.
        db.insert(TABLE_NAME, "", values);
        db.close();
    } catch (Exception e) {
        e.getLocalizedMessage();
    }
}

public void removePassword(String id){
    // get database.
    SQLiteDatabase db = getWritableDatabase();

    // delete database then close or print error.
    try {
        db.delete(TABLE_NAME, "_id="+id, null);
        db.close();
    } catch(Exception e) {
        e.getLocalizedMessage();
    }
}

public void updatePassword(String id, String n, String w, String u, String p, String d) {
    // get database.
    SQLiteDatabase db = getWritableDatabase();

    //update database then close or print error.
    try {
        ContentValues values = new ContentValues();
        values.put(COLUMN_ID, id);
        values.put(COLUMN_NAME, n);
        values.put(COLUMN_WEBSITE, w);
        values.put(COLUMN_USERNAME, u);
        values.put(COLUMN_PASSWORD, p);
        values.put(COLUMN_DESC, d);
        db.update(TABLE_NAME, values, "_id="+id, null);
        db.close();
    } catch (Exception e) {
        e.getLocalizedMessage();
    }
}

public ArrayList<PasswordResults> getPasswords() {
    // get database, password array, and select statement.
    passwords = new ArrayList<>();
    String refQuery = "Select "+COLUMN_NAME+", "+COLUMN_WEBSITE+", "+COLUMN_USERNAME+", "+COLUMN_PASSWORD+", "+COLUMN_DESC+" FROM "+TABLE_NAME;
    SQLiteDatabase db = getWritableDatabase();

    // link to database
    Cursor cursor = db.rawQuery(refQuery, null);
    if(cursor.moveToFirst()) {
        do {
            PasswordResults passwordResults = new PasswordResults();
            passwordResults.entryName = cursor.getString(0);
            passwordResults.website = cursor.getString(1);
            passwordResults.username = cursor.getString(2);
            passwordResults.password = cursor.getString(3);
            passwordResults.description = cursor.getString(4);
            passwords.add(passwordResults);
        } while(cursor.moveToNext());
    }
    db.close();
    return passwords;
}

public ArrayList<PasswordResults> getSelectedPassword(String id) {
    // get database, password array, and select statement.
    passwords = new ArrayList<>();
    String refQuery = "Select "+COLUMN_NAME+", "+COLUMN_WEBSITE+", "+COLUMN_USERNAME+", "+COLUMN_PASSWORD+", "+COLUMN_DESC+" FROM "+TABLE_NAME+" WHERE "+COLUMN_ID+" = "+id;
    SQLiteDatabase db = getWritableDatabase();

    // link to database
    Cursor cursor = db.rawQuery(refQuery, null);
    if(cursor.moveToFirst()) {
        do {
            PasswordResults passwordResults = new PasswordResults();
            passwordResults.id = Integer.parseInt(id);
            passwordResults.entryName = cursor.getString(0);
            passwordResults.website = cursor.getString(1);
            passwordResults.username = cursor.getString(2);
            passwordResults.password = cursor.getString(3);
            passwordResults.description = cursor.getString(4);
            passwords.add(passwordResults);
        } while(cursor.moveToNext());
    }
    db.close();
    return passwords;
}

А вот мой код для PasswordResults класса.

public class PasswordResults {
    public int id;
    public String entryName;
    public String website;
    public String username;
    public String password;
    public String description;
}

Может быть легко исправить, как половина вещей, которые я здесь надеваю, но спасибо за вашепомощь заранее.

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

Коэффициенты на строки не выбираются getSelectedPassword.Конструкция do ... while не будет введена (т. Е. cursor.moveToFirst() возвращает false), и, следовательно, в результате будет возвращен пустой ArrayList, не имеющий элементов и, следовательно, индекс 0 выходит за пределы.

Проверьте размер ArrayList и пытайтесь получить пароль только в том случае, если размер больше 0. Возможно, тост или что-то, указывающее на ошибку.

Очевидно, что вам необходимо выяснить, почему id передаваемый не найден, что будет основной причиной.

0 голосов
/ 26 ноября 2018

Если ваш id является строкой, вы должны изменить +id внутри запроса на + '"' + id + '"', поэтому он будет рассматриваться как строка.

String refQuery = "Select "+COLUMN_NAME+", "+COLUMN_WEBSITE+", "+COLUMN_USERNAME+", "+COLUMN_PASSWORD+", "+COLUMN_DESC+" FROM "+TABLE_NAME+" WHERE "+COLUMN_ID+" = "+ '"' + id + '"';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...