android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 1

Я хочу получить данные о своей машине по идентификатору. Но у меня возникли некоторые ошибки. И я не понимаю, почему это произошло???

MainActivity

DbHandler dbHandler = new DbHandler(this);
Car car1 = dbHandler.getCar(1);

DbHandler

public Car getCar(int id){
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = db.query(Util.TABLE_NAME, new String[]{Util.KEY_ID, Util.KEY_NAME,   Util.KEY_PRICE},
                Util.KEY_ID + "=?", new String[]{String.valueOf(id)}, null, null, null, null);


        if (cursor != null){
            cursor.moveToFirst();
        }
        Car car = new Car(cursor.getInt(0), cursor.getString(1), cursor.getDouble(2));
        return car;
    }

Car

public class Car {
    private int id;
    private String name;
    private double price;

    public Car(){

    }

    public Car(String name, double price) {
        this.name = name;
        this.price = price;
    }

    public Car(int id, String name, double price) {
        this.id = id;
        this.name = name;
        this.price = price;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }
}

Я написал метод "allCars", и все id я получаю

public List<Car> allCars(){
        SQLiteDatabase db = this.getReadableDatabase();
        List<Car> carList = new ArrayList<>();

        String allCars = "SELECT * FROM " + Util.TABLE_NAME;
        Cursor cursor = db.rawQuery(allCars, null);


        while(cursor.moveToNext()){
            int id = cursor.getInt(0);
            String name = cursor.getString(1);
            Double price = cursor.getDouble(2);

           // Log.i("allCars: ", "ID: " + id + " Name: " + name + " Price: " + price);

            carList.add(new Car(id, name, price));
        }
        cursor.close();
        db.close();

        return carList;
   }

введите сюда описание изображения


Ответы (1 шт):

Автор решения: Nowhere Man

Пробуйте улучшить логику для обработки результатов запроса -- в частности проверка на null не нужна, так как метод query НЕ возвращает null-овый курсор.
Также следует добавить логи и закрывать курсор / соединение с базой в методе getCar:

public Car getCar(int id) {
    SQLiteDatabase db = this.getReadableDatabase();
    Cursor cursor = db.query(
        Util.TABLE_NAME,                                          // table
        new String[]{Util.KEY_ID, Util.KEY_NAME, Util.KEY_PRICE}, // columns
        Util.KEY_ID + "=?",               // selection
        new String[]{String.valueOf(id)}, // selectionArgs                         
        null, null, null, null            // groupBy, having, orderBy, limit
    );

    Car car = null;
    if (cursor.moveToFirst()) {
        car = Car(cursor.getInt(0), cursor.getString(1), cursor.getDouble(2));
    } else {
        Log.i("getCar: ", "Cursor empty, no data found for ID = " + id);
    }

    cursor.close();
    db.close();

    return car;
}
→ Ссылка