CursorIndexOutOfBoundsException: Index 1 requested, with a size of 1. Error - Android
Asked Answered
M

3

6

I'm working on Android application and when trying to get SQLite database data as TextView (only one record in the table) facing this error.

The log and exception:

03-28 01:37:22.137: E/AndroidRuntime(9585): FATAL EXCEPTION: main
03-28 01:37:22.137: E/AndroidRuntime(9585): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.tourinfo/com.example.tourinfo.TourInfo}: android.database.CursorIndexOutOfBoundsException: Index 1 requested, with a size of 1
03-28 01:37:22.137: E/AndroidRuntime(9585):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)
03-28 01:37:22.137: E/AndroidRuntime(9585):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
03-28 01:37:22.137: E/AndroidRuntime(9585):     at android.app.ActivityThread.access$1500(ActivityThread.java:117)
03-28 01:37:22.137: E/AndroidRuntime(9585):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
03-28 01:37:22.137: E/AndroidRuntime(9585):     at android.os.Handler.dispatchMessage(Handler.java:99)
03-28 01:37:22.137: E/AndroidRuntime(9585):     at android.os.Looper.loop(Looper.java:123)
03-28 01:37:22.137: E/AndroidRuntime(9585):     at android.app.ActivityThread.main(ActivityThread.java:3683)
03-28 01:37:22.137: E/AndroidRuntime(9585):     at java.lang.reflect.Method.invokeNative(Native Method)
03-28 01:37:22.137: E/AndroidRuntime(9585):     at java.lang.reflect.Method.invoke(Method.java:507)
03-28 01:37:22.137: E/AndroidRuntime(9585):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
03-28 01:37:22.137: E/AndroidRuntime(9585):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
03-28 01:37:22.137: E/AndroidRuntime(9585):     at dalvik.system.NativeStart.main(Native Method)
03-28 01:37:22.137: E/AndroidRuntime(9585): Caused by: android.database.CursorIndexOutOfBoundsException: Index 1 requested, with a size of 1
03-28 01:37:22.137: E/AndroidRuntime(9585):     at android.database.AbstractCursor.checkPosition(AbstractCursor.java:580)
03-28 01:37:22.137: E/AndroidRuntime(9585):     at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:214)
03-28 01:37:22.137: E/AndroidRuntime(9585):     at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:41)
03-28 01:37:22.137: E/AndroidRuntime(9585):     at com.example.tourinfo.TourInfo.onCreate(TourInfo.java:44)
03-28 01:37:22.137: E/AndroidRuntime(9585):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
03-28 01:37:22.137: E/AndroidRuntime(9585):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
03-28 01:37:22.137: E/AndroidRuntime(9585):     ... 11 more

This is the java code:

public class TourInfo extends Activity{


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.tour_info);

    TourInfoDatabaseHelper jobInfoDatabaseHelper = new TourInfoDatabaseHelper(this);



    Cursor cursorJObInfo = jobInfoDatabaseHelper.getAllJobInfoRecords();
    if(cursorJObInfo.moveToFirst()){
        do{
            String startLocation = cursorJObInfo.getString(1);
            String endLocation = cursorJObInfo.getString(2);
            String type = cursorJObInfo.getString(3);
            Log.d("DB value", startLocation +" "+ endLocation +" "+ type);
        }while(cursorJObInfo.moveToNext());
    }


//  if(!cursorJObInfo.isClosed()){
//      cursorJObInfo.close();
 //   }
       TextView startLocationView = (TextView) findViewById(R.id.start_location_view);
        startLocationView.setText(cursorJObInfo.getString(1));
        TextView endLocationView = (TextView) findViewById(R.id.end_location_view);
        endLocationView.setText(cursorJObInfo.getString(2));
        TextView typeOfJourneyView = (TextView) findViewById(R.id.type_of_journey_view);
        typeOfJourneyView.setText(cursorJObInfo.getString(3));


}


public void onClickedLocations(View view){

    Intent intent = new Intent(this, LocationList.class);
    startActivity(intent);

}

}

TourInfoDatabaseHelper.java class

  public class TourInfoDatabaseHelper {

 // private static final int DATABASE_VERSION= 2;
 // private static final String DATABASE_NAME = "tourinfo.db";
private static final String TABLE_NAME = "tour_info_details";

public static final String JOBINFO_COLUMN_JOB_ID = "job_id";
public static final String JOBINFO_COLUMN_START_LOCATION = "start_location";
public static final String JOBINFO_COLUMN_END_LOCATION = "end_location";
public static final String JOBINFO_COLUMN_TYPE = "type";
public static final String JOBINFO_COLUMN_TOUR_NUMBER = "tour_number";
public static final String JOBINFO_COLUMN_USER_ID ="user_id";


private SQLiteDatabase jobInfoDatabase;
private JobInfoOpenHelper jobInfoOpenHelper;

public TourInfoDatabaseHelper (Context context) {
    jobInfoOpenHelper = new JobInfoOpenHelper(context);
    jobInfoDatabase = jobInfoOpenHelper.getWritableDatabase();
} 

public void saveJobInfoRecords (String startLocation,String endLocation,String type,String tourNumber,int userId){

    ContentValues contentValues = new ContentValues();

//  contentValues.put(JOBINFO_COLUMN_JOB_ID, jobId);
    contentValues.put(JOBINFO_COLUMN_START_LOCATION, startLocation);
    contentValues.put(JOBINFO_COLUMN_END_LOCATION, endLocation);
    contentValues.put(JOBINFO_COLUMN_TYPE, type);
    contentValues.put(JOBINFO_COLUMN_TOUR_NUMBER, tourNumber);
    contentValues.put(JOBINFO_COLUMN_USER_ID, userId);

    jobInfoDatabase.insert(TABLE_NAME, null, contentValues);

}

public Cursor getAllJobInfoRecords(){
    return jobInfoDatabase.rawQuery(" SELECT * FROM " + TABLE_NAME, null);
}

private class JobInfoOpenHelper extends SQLiteOpenHelper {


    JobInfoOpenHelper(Context context) {
        super(context,MainDBAdapter.DATABASE_NAME,null,MainDBAdapter.DATABASE_VERSION);
    }


    @Override
    public void onCreate(SQLiteDatabase jobInfoDatabase) {

    }

    @Override
    public void onUpgrade(SQLiteDatabase jobInfoDatabase, int oldVersion, int newVersion) {
    //  jobInfoDatabase.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
    //  onCreate(jobInfoDatabase);

    }

}


}

Please help me for avoid this error.

Melissiamelita answered 27/3, 2014 at 8:33 Comment(5)
Can you please highlight Line number 44 in TourInfo.javaGalegalea
Index 1 requested, with a size of 1 , it means that the size of that array is 1 so use 0 instead of calling with 1Sophist
Have written the query to create table first ?Sterling
yes i created table and it had one tecordMelissiamelita
@Galegalea line 44 is startLocationView.setText(cursorJObInfo.getString(1));Melissiamelita
A
9

You loop through your cursor in the do-while loop but access cursor data with getString() after it, when the cursor is pointing after the last result row.

It's a little unclear what you want to do: You're fetching all records but are only using one result row. As a quick fix, capture the values inside the do-while and not after, e.g.

String startLocation = null;
String endLocation = null;
String type = null;

if(cursorJObInfo.moveToFirst()){
    do{
        startLocation = cursorJObInfo.getString(1);
        endLocation = cursorJObInfo.getString(2);
        type = cursorJObInfo.getString(3);
        Log.d("DB value", startLocation +" "+ endLocation +" "+ type);
    }while(cursorJObInfo.moveToNext());
}

// ...
startLocationView.setText(startLocation); // instead of calling getString() on the cursor here
// the same for the other textviews
Aught answered 27/3, 2014 at 8:50 Comment(0)
H
0

If you encounter a similar error in the future, this is the cause of the problem:

You are resetting the index before checking whether the cursor is empty because do..while executes at least once before checking if the condition is satisfied. to avoid this error, try while...do instead. You can even ignore the do part:

First check if the cursor is empty using Cursor.geCount

then move to the first record. Note: make sure you're not in the loop otherwise your will get into infinite loop.

then loop through the cursor using while..do

if(yourCursor.getCount()>0){
   yourCursor.moveToFirst();
   while(!yourCursor.isAfterLast()){
       startLocation = yourCursor.getString(1);
       endLocation = yourCursor.getString(2);
      yourCursor.moveToNext();
   }
}
Hippocampus answered 25/6, 2023 at 13:52 Comment(0)
S
-2

Check whether there is data available in the table.

This Cursor cursorJObInfo = jobInfoDatabaseHelper.getAllJobInfoRecords(); is NULL because there is probably no data in the table.

Sidewalk answered 27/3, 2014 at 8:38 Comment(1)
table is created and it has one recordMelissiamelita

© 2022 - 2024 — McMap. All rights reserved.