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;
}