在从中访问数据之前,确保 Cursor 已正确初始化 [英] Make sure the Cursor is initialized correctly before accessing data from it

查看:38
本文介绍了在从中访问数据之前,确保 Cursor 已正确初始化的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试从我的数据库中获取数据.

Im trying to get data from my DB.

这是我的代码:

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;

代码在这一行失败:

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

错误信息是:

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

对于通话记录

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.

感谢您的帮助.

推荐答案

就我而言,这是因为我没有将列包含在传递给 CursorLoader 构造函数的投影中.这意味着我试图从返回的游标中不存在的列访问数据.

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...

这篇关于在从中访问数据之前,确保 Cursor 已正确初始化的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆