Я изучаю, как использовать базы данных на Android, и я пробую простой пример, в котором у меня есть два текстовых поля [тормоза и об / мин], когда я ввожу значения в эти поля и нажимаю «кнопку записи», он вводит их в таблицу базы данных »производительность ". Когда я нажимаю кнопку «читать», он должен запросить таблицу и распечатать ее содержимое, но при запросе я получаю следующую ошибку:
Android.database.CursorIndexOutOfBoundsException: запрошен индекс -1 с размером 0
Вот мой соответствующий код:
private static final String KEY_ROWID = "_id";
private static final String KEY_BRAKES = "brakes";
private static final String KEY_RPM="rpm";
private static final String DATABASE_NAME = "MyDB2";
private static final String DATABASE_TABLE = "performance";
private static final int DATABASE_VERSION=1;
private static final String DATABASE_CREATE = "create table performance (_id integer primary key autoincrement, " + "brakes text not null, rpm text not null);";
//--insert an entry to the database--
public void insertData(String filter, String data){
ContentValues entry = new ContentValues();
if(filter.equals("b")){
entry.put(KEY_BRAKES, data);
Log.d(TAG,"inserted brake data");
db.insert(DATABASE_TABLE, null, entry);
}
else if (filter.equals("r")){
entry.put(KEY_RPM, data);
Log.d(TAG,"inserted rpm data");
db.insert(DATABASE_TABLE, null, entry);
}
}
//--retrive all entries
public Cursor getAllData(){
Log.d(TAG,"about to query");
try{
Cursor c = db.query(DATABASE_TABLE, new String[]{KEY_BRAKES,KEY_RPM}, null, null, null, null, null);
Log.d(TAG,"id=" + c.getString(0));
return c;
}catch(Exception e){
Log.d (TAG,"error");
Log.e(TAG,e.toString());
}
return null;
}
И я ввожу предметы следующим образом:
brakeRead = brakes.getText().toString();
rpmRead = brakes.getText().toString();
db.open();
db.insertData("b", brakeRead);
db.insertData("r", rpmRead);
db.close();
И способ запроса выглядит следующим образом:
db.open();
Cursor c = db.getAllData();
if(c.moveToFirst())
{
do{
output.append("id: " + c.getString(0) + " brakes: " + c.getString(1) + " rpm: " + c.getString(2));
}while(c.moveToNext());
}
db.close();
Но я получаю эту ошибку при запросе: android.database.CursorIndexOutOfBoundsException: Индекс -1 запрошен с размером 0
Может ли кто-нибудь увидеть, что я делаю что-то не так?
3 ответа
Запрос идеально подходит для получения данных, но вы получили ошибку, указанную ниже, это означает, что у вас нет записи в вашей базе данных, поэтому я думаю, что при вставке базы данных чего-то не хватает
android.database.CursorIndexOutOfBoundsException: запрошен индекс -1 с размером 0
Вы установили и тормоза, и обороты не равными нулю, но вы вставляете данные в каждый столбец по одному. Я бы предложил переписать insertData следующим образом:
public void insertData(String brakes, String rpm){
ContentValues entry = new ContentValues();
entry.put(KEY_BRAKES, brakes);
Log.d(TAG,"inserted brake data");
entry.put(KEY_RPM, rpm);
Log.d(TAG,"inserted rpm data");
db.insert(DATABASE_TABLE, null, entry);
}
Затем вы бы назвали это так:
brakeRead = brakes.getText().toString();
rpmRead = brakes.getText().toString();
db.open();
db.insertData(brakeRead, rpmRead);
db.close();
Измените свой код с
if(c.moveToFirst())
{
do{
output.append("id: " + c.getString(0) + " brakes: " + c.getString(1) + " rpm: " + c.getString(2));
}while(c.moveToNext());
}
К
while(c.moveToNext()){
output.append("id: " + c.getString(0) + " brakes: " + c.getString(1) + " rpm: " + c.getString(2));
}
Обновить
Ваш запрос
Cursor c = db.query(DATABASE_TABLE, new String[]{KEY_BRAKES,KEY_RPM}, null, null, null, null, null);
Который выбирает два столбца (BREAKS, RPM). Но вы запрашиваете 3, измените его на
Cursor c = db.query(DATABASE_TABLE, new String[]{KEY_ROWID,KEY_BRAKES,KEY_RPM}, null, null, null, null, null);
Похожие вопросы
Связанные вопросы
Новые вопросы
android
Android - это мобильная операционная система Google, используемая для программирования или разработки цифровых устройств (смартфоны, планшеты, автомобили, телевизоры, одежда, стекло, IoT). Для тем, связанных с Android, используйте специальные теги Android, такие как android-intent, android-activity, android-адаптер и т. Д. Для вопросов, не связанных с разработкой или программированием, но связанных с платформой Android, используйте эту ссылку: https: // android.stackexchange.com .