Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Make sure the Cursor is initialized correctly before accessing data from it

Im trying to get data from my DB.

This is my code:

String[] columns = new String[] {COLUMN_FACEBOOK_ALBUM_COVER, COLUMN_FACEBOOK_ALBUM_IS_ACTIVE};

        String whereClause = COLUMN_FACEBOOK_ALBUM_IS_ACTIVE + "= '" + 1 + "'";

        Cursor cAlbum = ourDatabase.query(TABLE_FACEBOOK, columns, whereClause,null, null, null, null);

        columns = new String[] {COLUMN_FACEBOOK_BIG_IMAGE, COLUMN_FACEBOOK_IMAGE_IS_ACTIVE};

        whereClause = COLUMN_FACEBOOK_IMAGE_IS_ACTIVE + "= '" + 1 + "'";

        Cursor cImage = ourDatabase.query(TABLE_FACEBOOK_IMAGES, columns, null,null, null, null, null);

        String[] list = new String[cAlbum.getCount()+cImage.getCount()];

        int p = 0;

        if(cAlbum.getCount() < 1 && cImage.getCount() < 1)
        {
            cAlbum.close();
            cImage.close();
            return null;
        }

        Log.i("cImage length", cImage.getCount()+"");
        Log.i("cAlbum length", cAlbum.getCount()+"");

        Log.i("list length", list.length+"");

        int i = cImage.getColumnIndex(COLUMN_FACEBOOK_BIG_IMAGE);
        int j = cAlbum.getColumnIndex(COLUMN_FACEBOOK_ALBUM_COVER);

        for (cAlbum.moveToFirst(); !cAlbum.isAfterLast(); cAlbum.moveToNext())
        {
            list[p] = cAlbum.getString(j);
            p++;
        }

        for (cImage.moveToFirst(); !cImage.isAfterLast(); cImage.moveToNext())
        {
            list[p] = cImage.getString(i);
            Log.i("image length", list[p].length()+"");
            p++;
        }

        cAlbum.close();
        cImage.close();

        return list;

The code fails on this line:

list[p] = cImage.getString(i);

The error message is:

11-27 12:34:59.683: E/CursorWindow(6901): Failed to read row 2, column 0 from a CursorWindow which has 2 rows, 2 columns.
11-27 12:34:59.683: D/AndroidRuntime(6901): Shutting down VM
11-27 12:34:59.683: W/dalvikvm(6901): threadid=1: thread exiting with uncaught exception (group=0x41e9b930)
11-27 12:34:59.693: E/AndroidRuntime(6901): FATAL EXCEPTION: main
11-27 12:34:59.693: E/AndroidRuntime(6901): java.lang.RuntimeException: Unable to create service com.example.imageswidget.WidgetService: java.lang.IllegalStateException: Couldn't read row 2, col 0 from CursorWindow.  Make sure the Cursor is initialized correctly before accessing data from it.
11-27 12:34:59.693: E/AndroidRuntime(6901):     at android.app.ActivityThread.handleCreateService(ActivityThread.java:2667)
11-27 12:34:59.693: E/AndroidRuntime(6901):     at android.app.ActivityThread.access$1600(ActivityThread.java:153)
11-27 12:34:59.693: E/AndroidRuntime(6901):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1329)
11-27 12:34:59.693: E/AndroidRuntime(6901):     at android.os.Handler.dispatchMessage(Handler.java:99)
11-27 12:34:59.693: E/AndroidRuntime(6901):     at android.os.Looper.loop(Looper.java:137)
11-27 12:34:59.693: E/AndroidRuntime(6901):     at android.app.ActivityThread.main(ActivityThread.java:5227)
11-27 12:34:59.693: E/AndroidRuntime(6901):     at java.lang.reflect.Method.invokeNative(Native Method)
11-27 12:34:59.693: E/AndroidRuntime(6901):     at java.lang.reflect.Method.invoke(Method.java:511)
11-27 12:34:59.693: E/AndroidRuntime(6901):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)
11-27 12:34:59.693: E/AndroidRuntime(6901):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562)
11-27 12:34:59.693: E/AndroidRuntime(6901):     at dalvik.system.NativeStart.main(Native Method)
11-27 12:34:59.693: E/AndroidRuntime(6901): Caused by: java.lang.IllegalStateException: Couldn't read row 2, col 0 from CursorWindow.  Make sure the Cursor is initialized correctly before accessing data from it.
11-27 12:34:59.693: E/AndroidRuntime(6901):     at android.database.CursorWindow.nativeGetString(Native Method)
11-27 12:34:59.693: E/AndroidRuntime(6901):     at android.database.CursorWindow.getString(CursorWindow.java:434)
11-27 12:34:59.693: E/AndroidRuntime(6901):     at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:51)
11-27 12:34:59.693: E/AndroidRuntime(6901):     at com.example.imageswidget.DataBaseMain.getFacebookImagesForWidget(DataBaseMain.java:943)
11-27 12:34:59.693: E/AndroidRuntime(6901):     at com.example.imageswidget.WidgetService.onCreate(WidgetService.java:51)
11-27 12:34:59.693: E/AndroidRuntime(6901):     at android.app.ActivityThread.handleCreateService(ActivityThread.java:2657)
11-27 12:34:59.693: E/AndroidRuntime(6901):     ... 10 more

For the call log

Log.i("image length", list[p].length()+"");

I get few calls before the code breaks. The problem seems to happen only for some rows but the error code does not tell me what the problem is.

Thanks for helping.

like image 929
dasdasd Avatar asked Mar 19 '26 04:03

dasdasd


2 Answers

In my case it was because I didn't include the column in the projection passed into the CursorLoader constructor. Which means I was trying to access data from a column that didn't exist in the cursor that was returned.

I hope this helps somebody...

like image 52
Oladipo Olasemo Avatar answered Mar 21 '26 18:03

Oladipo Olasemo


I have encountered this same exception before. In my case the cause was a database cell containing too much data (a huge string). Judging from the code (COLUMN_FACEBOOK_BIG_IMAGE) I guess that you have encountered the same problem. For the solution was to check the size of the strings that were put into the DB (and down scaling the image when needed). Hope this helps!

like image 33
Peter Avatar answered Mar 21 '26 18:03

Peter



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!