Android - 请求大小为0的CursorIndexOutOfBounds索引0

时间:2015-06-14 15:51:30

标签: android sqlite

我试图通过使用Cursor将我的SQLite数据库中的某些值返回到我的代码中但是我得到了

06-14 22:31:30.586: E/AndroidRuntime(18859): android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
06-14 22:31:30.586: E/AndroidRuntime(18859):    at android.database.AbstractCursor.checkPosition(AbstractCursor.java:426)
06-14 22:31:30.586: E/AndroidRuntime(18859):    at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:136)
06-14 22:31:30.586: E/AndroidRuntime(18859):    at android.database.AbstractWindowedCursor.getInt(AbstractWindowedCursor.java:68)
06-14 22:31:30.586: E/AndroidRuntime(18859):    at com.km.parkit.ChosenSlotDAO.cursorToSlot(ChosenSlotDAO.java:166)
06-14 22:31:30.586: E/AndroidRuntime(18859):    at com.km.parkit.ChosenSlotDAO.createSlot(ChosenSlotDAO.java:57)
06-14 22:31:30.586: E/AndroidRuntime(18859):    at com.km.parkit.MainMap$1.onClick(MainMap.java:80)
06-14 22:31:30.586: E/AndroidRuntime(18859):    at android.view.View.performClick(View.java:4756)
06-14 22:31:30.586: E/AndroidRuntime(18859):    at android.view.View$PerformClick.run(View.java:19761)

我必须使用单独的get这样的

来获取每一列
public String getSelectedSlot() {
            String slot = new String();

            Cursor cursor = database.query(ChosenSlotDatabaseHandler.TABLE_CHOSEN_PARKING_SLOT,
                chosenSlotColumn, null, null, null, null, null);

            if( cursor.moveToFirst() ) {
                slot = cursor.getString(0);
            }
            // make sure to close the cursor
            cursor.close();
            return slot;
          }

      public String getParked() {
            String parked = new String();

            Cursor cursor = database.query(ChosenSlotDatabaseHandler.TABLE_CHOSEN_PARKING_SLOT,
                    chosenParkedColumn, null, null, null, null, null);

            if( cursor.moveToFirst() ) {
                parked = cursor.getString(0);
            }
            // make sure to close the cursor
            cursor.close();
            return parked;
          }

      public String getIsParked() {
            String isParked = new String();

            Cursor cursor = database.query(ChosenSlotDatabaseHandler.TABLE_CHOSEN_PARKING_SLOT,
                    isParkedColumn, null, null, null, null, null);

            if( cursor.moveToFirst() ) {
                isParked = cursor.getString(0);
            }
            // make sure to close the cursor
            cursor.close();
            return isParked;
          }

这是updateSlot

public ChosenParkingSlot updateSlot(String Id, String selectedSlot, String parkedRow, String isParked) {
            ContentValues values = new ContentValues();
            values.put(ChosenSlotDatabaseHandler.CHOSEN_ID, Id);
            values.put(ChosenSlotDatabaseHandler.CHOSEN_SLOT_NAME, selectedSlot);
            values.put(ChosenSlotDatabaseHandler.CHOSEN_PARKED_ROW, parkedRow);
            values.put(ChosenSlotDatabaseHandler.IS_PARKED, isParked);
            long insertId = database.update(ChosenSlotDatabaseHandler.TABLE_CHOSEN_PARKING_SLOT, values, "_id= " + Id,
                null);
            Cursor cursor = database.query(ChosenSlotDatabaseHandler.TABLE_CHOSEN_PARKING_SLOT,
                allColumns, ChosenSlotDatabaseHandler.CHOSEN_ID + " = " + insertId, null,
                null, null, null);
            cursor.moveToFirst();
            ChosenParkingSlot newSlot = cursorToSlot(cursor);
            cursor.close();
            return newSlot;
          }

这是我的Cursor

private ChosenParkingSlot cursorToSlot(Cursor cursor) {
          ChosenParkingSlot parkingSlot = new ChosenParkingSlot();
          parkingSlot.setId(cursor.getInt(0));
          parkingSlot.setSlotName(cursor.getString(1));
          parkingSlot.setParkedRow(cursor.getString(2));
          parkingSlot.setIsParked(cursor.getInt(3));
          return parkingSlot;
      }

出了什么问题?索引0表示第一列..右....?

我创建的数据库的值为id = 1slot_name = selectedSlot其余为空。

2 个答案:

答案 0 :(得分:0)

首先在获取数据之前检查此条件

if(cursor!=null && cursor.getCount()>0){
  cursor.moveToFirst();
  num = cursor.getString(cursor.getColumnIndex("<column index>")); 
}

也许你的光标对象没有从数据库中获取任何内容。

请遵循此stackoverflow链接android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0

答案 1 :(得分:0)

实际上是因为我的光标指向空值,是的,由4k3R回答。

我使用了public ChosenParkingSlot createSlot(String id, String slot, String parkedRow, String isParked)

要创建停车位索引0,但是我忘了我不应该将NULL值放入这四个字符串中的任何一个,因为CursorNULL不友好。< / p>

我已使用String的值"0"代替empty代替Strings中的任何一个#ifndef DateToolsLocalizedStrings #define DateToolsLocalizedStrings(key) \ NSLocalizedStringFromTableInBundle(key, @"DateTools", [NSBundle bundleWithPath:[[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"DateTools.bundle"]], nil) #endif 。感谢所有帮助我实现错误的人! :d