【问题标题】:CursorIndexOutOfBoundsException problem:Index 4 requested, with a size of 4CursorIndexOutOfBoundsException 问题:请求索引 4,大小为 4
【发布时间】:2011-08-23 17:39:52
【问题描述】:

我想为每个制造商显示一​​个带有一些描述的 AlertDialog,为此,我正在使用此代码:

protected boolean onTap(int index) {
            db = openHelper.getWritableDatabase();

            String[] result_columns = new String[] {COL_DESCRI};

            Cursor cur = db.query(true, TABLE_COORD, result_columns,
             null, null, null, null, null, null);

                 cur.moveToPosition(index);
                String description = cur.getString(cur.getColumnIndexOrThrow("description"));

                AlertDialog.Builder dialog = new AlertDialog.Builder(Geo.this);
                dialog.setTitle("Infos.");
                dialog.setMessage(description);
                dialog.setPositiveButton("OK", new OnClickListener() {    
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();
                    }
                });
                dialog.show();

                //cur.moveToNext();

             cur.close();
             db.close();

            return true;
        }

问题是有一些标记表明 alertdialog 结果是正确的,还有一些标记表明当我点击它时我有一个 FC。 日志猫:

08-23 17:41:37.531: ERROR/AndroidRuntime(10004): Uncaught handler: thread main exiting due to uncaught exception
08-23 17:41:37.550: ERROR/AndroidRuntime(10004): android.database.CursorIndexOutOfBoundsException: Index 4 requested, with a size of 4
08-23 17:41:37.550: ERROR/AndroidRuntime(10004):     at android.database.AbstractCursor.checkPosition(AbstractCursor.java:580)
08-23 17:41:37.550: ERROR/AndroidRuntime(10004):     at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:214)
08-23 17:41:37.550: ERROR/AndroidRuntime(10004):     at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:41)
08-23 17:41:37.550: ERROR/AndroidRuntime(10004):     at carburant.android.com.Geo$ItemizedOverlayPerso.onTap(Geo.java:244)
08-23 17:41:37.550: ERROR/AndroidRuntime(10004):     at com.google.android.maps.ItemizedOverlay.onTap(ItemizedOverlay.java:453)
08-23 17:41:37.550: ERROR/AndroidRuntime(10004):     at com.google.android.maps.OverlayBundle.onTap(OverlayBundle.java:83)
08-23 17:41:37.550: ERROR/AndroidRuntime(10004):     at com.google.android.maps.MapView$1.onSingleTapUp(MapView.java:346)
08-23 17:41:37.550: ERROR/AndroidRuntime(10004):     at android.view.GestureDetector.onTouchEvent(GestureDetector.java:506)
08-23 17:41:37.550: ERROR/AndroidRuntime(10004):     at com.google.android.maps.MapView.onTouchEvent(MapView.java:628)
08-23 17:41:37.550: ERROR/AndroidRuntime(10004):     at android.view.View.dispatchTouchEvent(View.java:3709)
08-23 17:41:37.550: ERROR/AndroidRuntime(10004):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:852)
08-23 17:41:37.550: ERROR/AndroidRuntime(10004):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
08-23 17:41:37.550: ERROR/AndroidRuntime(10004):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
08-23 17:41:37.550: ERROR/AndroidRuntime(10004):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
08-23 17:41:37.550: ERROR/AndroidRuntime(10004):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
08-23 17:41:37.550: ERROR/AndroidRuntime(10004):     at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1659)
08-23 17:41:37.550: ERROR/AndroidRuntime(10004):     at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1107)
08-23 17:41:37.550: ERROR/AndroidRuntime(10004):     at android.app.Activity.dispatchTouchEvent(Activity.java:2061)
08-23 17:41:37.550: ERROR/AndroidRuntime(10004):     at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1643)
08-23 17:41:37.550: ERROR/AndroidRuntime(10004):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1691)
08-23 17:41:37.550: ERROR/AndroidRuntime(10004):     at android.os.Handler.dispatchMessage(Handler.java:99)
08-23 17:41:37.550: ERROR/AndroidRuntime(10004):     at android.os.Looper.loop(Looper.java:123)
08-23 17:41:37.550: ERROR/AndroidRuntime(10004):     at android.app.ActivityThread.main(ActivityThread.java:4363)
08-23 17:41:37.550: ERROR/AndroidRuntime(10004):     at java.lang.reflect.Method.invokeNative(Native Method)
08-23 17:41:37.550: ERROR/AndroidRuntime(10004):     at java.lang.reflect.Method.invoke(Method.java:521)
08-23 17:41:37.550: ERROR/AndroidRuntime(10004):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
08-23 17:41:37.550: ERROR/AndroidRuntime(10004):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
08-23 17:41:37.550: ERROR/AndroidRuntime(10004):     at dalvik.system.NativeStart.main(Native Method)

当我将cur.moveToPosition(index); 放在String description = cur.getString(cur.getColumnIndexOrThrow("description")); 下时,我有Index -1 requested, with a size of 4 否则,就像上面的代码Index 4 requested, with a size of 4

【问题讨论】:

  • 负索引似乎是引发 CursorIndexOutOfBoundsException 的正当理由,为什么会有负索引?

标签: android sqlite google-maps google-maps-markers


【解决方案1】:

数组索引以0 开头,而不是1。您的第四个元素存储在索引3

当我把 cur.moveToPosition(index);在 String description = cur.getString(cur.getColumnIndexOrThrow("description"));我请求了索引 -1,否则大小为 4,如上面的代码请求索引 4,大小为 4

当第一次返回行集时,光标将位于位置-1,即第一行之前。

【讨论】:

  • 做到了,但我总是有一个 FC 但有其他标记:08-24 00:57:16.549: ERROR/AndroidRuntime(365): android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 4
【解决方案2】:

刚打电话
Cursor cur = db.query(true, TABLE_COORD, result_columns, null, null, null, null, null, null);

您的光标将位于 -1 位置,如果您在光标位于 -1 索引时获取数据,则会出现此异常。
当您第一次调用 cur.moveToPosition(index-1); 时,您的索引值可能为 0,即问题。

【讨论】:

    【解决方案3】:

    错误肯定在代码String description = cur.getString(cur.getColumnIndexOrThrow("description")); 中,因为您没有这样的列。您只有 COL_DESCRI 列,可能与“描述”不匹配

    【讨论】:

    • 不,我已验证并且我有描述栏。我不认为这是问题的根源。
    • 你试过这段代码了吗 cur.getString(cur.getColumnIndexOrThrow(COL_DESCRI));您也可以显式运行 String ... = db.rawQuery("SELECT ... ;", null);
    • 根据 API Reference,getColumnIndexOrThrow() 只抛出 IllegalArgumentException 而不是 android.database.CursorIndexOutOfBoundsException。跨度>
    猜你喜欢
    • 1970-01-01
    • 2012-06-30
    • 2019-10-26
    • 1970-01-01
    • 2013-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-06
    相关资源
    最近更新 更多