【问题标题】:CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0. Error - AndroidCursorIndexOutOfBoundsException:请求索引 0,大小为 0。错误 - Android
【发布时间】:2012-01-05 18:31:40
【问题描述】:

我正在尝试在 expandableListView 中获取孩子的位置 ID,并根据点击的孩子开始另一个类,我正在这样做:

    @Override
    public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) 
    {
        // TODO Auto-generated method stub
        super.onChildClick(parent, v, groupPosition, childPosition, id);
        Intent i = new Intent(this, SavedEntries.class);
        i.putExtra("_id", id);
        startActivityForResult(i, ACTIVITY_EDIT);
        return super.onChildClick(parent, v, groupPosition, childPosition, id);
    }

但我不断收到此错误:

01-05 13:14:28.232: E/AndroidRuntime(316): FATAL EXCEPTION: main
01-05 13:14:28.232: E/AndroidRuntime(316): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.x17.projects.strikezone/com.x17.projects.strikezone.SavedEntries}: android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
01-05 13:14:28.232: E/AndroidRuntime(316):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
01-05 13:14:28.232: E/AndroidRuntime(316):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
01-05 13:14:28.232: E/AndroidRuntime(316):  at android.app.ActivityThread.access$2300(ActivityThread.java:125)
01-05 13:14:28.232: E/AndroidRuntime(316):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
01-05 13:14:28.232: E/AndroidRuntime(316):  at android.os.Handler.dispatchMessage(Handler.java:99)
01-05 13:14:28.232: E/AndroidRuntime(316):  at android.os.Looper.loop(Looper.java:123)
01-05 13:14:28.232: E/AndroidRuntime(316):  at android.app.ActivityThread.main(ActivityThread.java:4627)
01-05 13:14:28.232: E/AndroidRuntime(316):  at java.lang.reflect.Method.invokeNative(Native Method)
01-05 13:14:28.232: E/AndroidRuntime(316):  at java.lang.reflect.Method.invoke(Method.java:521)
01-05 13:14:28.232: E/AndroidRuntime(316):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
01-05 13:14:28.232: E/AndroidRuntime(316):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
01-05 13:14:28.232: E/AndroidRuntime(316):  at dalvik.system.NativeStart.main(Native Method)
01-05 13:14:28.232: E/AndroidRuntime(316): Caused by: android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
01-05 13:14:28.232: E/AndroidRuntime(316):  at android.database.AbstractCursor.checkPosition(AbstractCursor.java:580)
01-05 13:14:28.232: E/AndroidRuntime(316):  at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:214)
01-05 13:14:28.232: E/AndroidRuntime(316):  at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:41)
01-05 13:14:28.232: E/AndroidRuntime(316):  at com.x17.projects.strikezone.SavedEntries.getDateRow(SavedEntries.java:56)
01-05 13:14:28.232: E/AndroidRuntime(316):  at com.x17.projects.strikezone.SavedEntries.onCreate(SavedEntries.java:48)
01-05 13:14:28.232: E/AndroidRuntime(316):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
01-05 13:14:28.232: E/AndroidRuntime(316):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
01-05 13:14:28.232: E/AndroidRuntime(316):  ... 11 more

这是我将 id 发送到的地方:

Bundle extras = getIntent().getExtras();
mRowId = extras != null ? extras.getLong("_id") : null;

    private void getDateRow()
    {
        Cursor mCursor = mDbHelper.fetchRow(mRowId);
        date = mCursor.getString(0); //Line 56, this is where the error occurs.
        mCursor.close();
    }

这是上面的查询:

public Cursor fetchRow(long rowId)
    {
        Cursor cursor = mDb.rawQuery("SELECT date FROM entry WHERE _id=" + rowId, null);
        if(cursor != null)
        {
            cursor.moveToFirst();
        }
        return cursor;
    }

为什么会出现此错误?我在这里做错了什么?

提前致谢。

【问题讨论】:

    标签: android sqlite exception expandablelistview


    【解决方案1】:

    光标位于空位置。循环游标以获取行。

    while(mCursor.moveToNext()) {
        date = mCursor.getString(0);
    }
    

    【讨论】:

      【解决方案2】:

      这是因为您没有在 Cursor 中获得任何行。确保 fetchRow(...) 确实返回了一些数据。日期字段是String类型吗?

      【讨论】:

      • 是的,日期字段是一个字符串。我检查了游标计数,它是 0,所以这就是发生此错误的原因。我还能如何从被点击的孩子那里获取 id 以将其传递给 SavedEntries.class?
      • 调试并查看 id 是否在 onChildClick 方法中获得所需的值。
      • 由于某种原因,调用 onChildClick 时 groupPosition、childPosition 和 id 的值都为 0。
      • 您需要找出原因,我认为您在此处粘贴的数据库检索逻辑没有任何问题。当您解决其他问题时,它应该可以正常工作。
      • 我开始使用 ListView,它工作得很好。但是当我将它更改为 ExpandableListView 时,我开始遇到这个问题。所以也许这个方法没有被正确调用或什么?因为它没有给我孩子位置的ID。
      【解决方案3】:

      在 getDateRow 方法中调用mCursor.moveToFirst() 方法,然后再从中获取任何内容。最好将它用作条件,因为mCursor.moveToFirst() 返回一个布尔值,如果光标可以移动到第一个位置,则返回 true,如果光标不能移动,则返回 false。 这就是我的意思:

         private void getDateRow(){
              Cursor mCursor = mDbHelper.fetchRow(mRowId);
              if (mCursor.moveToFirst()){
              date = mCursor.getString(0);
              }
              mCursor.close();
          }
      

      【讨论】:

        猜你喜欢
        • 2013-01-10
        • 1970-01-01
        • 1970-01-01
        • 2012-06-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-06
        相关资源
        最近更新 更多