keshav kowshik
keshav kowshik

Reputation: 2374

Android Sqlite Error: java.lang.illegalstateException. Couldn't read row 0 , column 1

I am trying to make a query here, but I am getting an error. I am not getting what exactly my mistake here, please provide suggestions and help me to come out of this issue. All suggestions are welcome. Thanks in advance.

My SQL Query:

public User getSubTaskNumber () {

        db = helper.getReadableDatabase();
        User user = null;
        Cursor cursor = null;

        String[] columns = {SQLiteHelper.UID, String.valueOf((SQLiteHelper.TASK)), String.valueOf((SQLiteHelper.SUB_TASK))};
        String selectQuery = " SELECT count(*) FROM " +SQLiteHelper.TABLE_USER + " WHERE " + SQLiteHelper.TASK + " =? " ;

        cursor = db.rawQuery(selectQuery, null);

        if (cursor != null && cursor.moveToFirst()) {
            {

                user = new User((Integer.parseInt(cursor.getString(0))), (Integer.parseInt(cursor.getString(1))));

            }

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


        }
        return user;
    }

I am setting the fetched values in one of my activities as shown below:

 User user = db.getSubTaskNumber();
        subTaskNumber.setText(user.getSubTask());

My User Table schema:

public static final String CREATE_TABLE_USER = " CREATE TABLE " + TABLE_USER + " ( " + UID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
            TASK + " INTEGER, " + SUB_TASK + " INTEGER, " + " FOREIGN KEY (" + TASK + ") REFERENCES " + TABLE_NAME + " (" + UID + " )" +
            " FOREIGN KEY (" + SUB_TASK + ") REFERENCES " + TABLE_NAME_CHILD + " (" + UIDCHILD + ") );";

ADB trace:

03-09 16:39:03.091    2080-2080/com.ms.t.tms E/CursorWindow﹕ Failed to read row 0, column 1 from a CursorWindow which has 1 rows, 1 columns.
03-09 16:39:03.132    2080-2080/com.ms.t.tms D/AndroidRuntime﹕ Shutting down VM
03-09 16:39:03.142    2080-2080/com.ms.t.tms E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.ms.t.tms, PID: 2080
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.ms.t.tms/com.ms.t.tms.DetailView}: java.lang.IllegalStateException: Couldn't read row 0, col 1 from CursorWindow.  Make sure the Cursor is initialized correctly before accessing data from it.
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2298)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)
            at android.app.ActivityThread.access$800(ActivityThread.java:144)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5221)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
     Caused by: java.lang.IllegalStateException: Couldn't read row 0, col 1 from CursorWindow.  Make sure the Cursor is initialized correctly before accessing data from it.
            at android.database.CursorWindow.nativeGetString(Native Method)
            at android.database.CursorWindow.getString(CursorWindow.java:438)
            at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:51)
            at com.ms.t.tms.SQLiteDataBaseAdapter.getSubTaskNumber(SQLiteDataBaseAdapter.java:282)
            at com.ms.t.tms.DetailView.onCreate(DetailView.java:88)
            at android.app.Activity.performCreate(Activity.java:5933)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2251)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)
            at android.app.ActivityThread.access$800(ActivityThread.java:144)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5221)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

UPDATED QUERY:

public User getSubTaskNumber () {

        db = helper.getReadableDatabase();
        User user = null;
        Cursor cursor = null;

        String[] columns = {SQLiteHelper.UID, String.valueOf((SQLiteHelper.TASK)), String.valueOf((SQLiteHelper.SUB_TASK))};
        String selectQuery = " SELECT * FROM " +SQLiteHelper.TABLE_USER + " WHERE " + SQLiteHelper.TASK + " =? " ;

        cursor = db.rawQuery(selectQuery, null);

        if (cursor.getCount() > 0)
           cursor.moveToFirst();

                user = new User((Integer.parseInt(cursor.getString(0))), (Integer.parseInt(cursor.getString(1))));



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



        return user;
    }

Upvotes: 0

Views: 1576

Answers (1)

M D
M D

Reputation: 47807

You should change

String selectQuery = " SELECT count(*) FROM " +SQLiteHelper.TABLE_USER + " WHERE " + SQLiteHelper.TASK + " =? " ;

to

String selectQuery = " SELECT * FROM " +SQLiteHelper.TABLE_USER + " WHERE " + SQLiteHelper.TASK + " =? " ;

Edit:

cursor.getCount();

This will give you total (affected row count).

Then you can check

if(cursor.getCount()>0){

    cursor.moveToFirst();

} 

Upvotes: 2

Related Questions