CursorIndexOutOfBoundException:请求索引1,大小为1

时间:2011-07-27 11:35:10

标签: java android sqlite

再次出现这个问题,我遇到了Android版sqlite的问题

我目前收到“CursorIndexOutOfBoundsException:请求的索引1,大小为1” 但是,我有索引-1的这个例外,然后插入了一个cursor.moveToFirst(),然后我用索引0,然后cursor.moveToNext(); 我想用我的代码做什么?我想要一个选定项目的信息(这就是为什么selectionArgs与sQueryid有关。我做错了什么?

    Cursor c = a.managedQuery(uri, 
            projection, //projection
            "_ID=?", //selection string
            new String[]{sQueryid}, //selection args array of strings
            DepotTableMetaData.DEFAULT_SORT_ORDER); //sort order
    c.moveToFirst();
    c.moveToNext();
    int iqrcode = c.getColumnIndex(ContentProviderMetaData.DepotTableMetaData.ITEM_QRCODE);     
    int iname = c.getColumnIndex(ContentProviderMetaData.DepotTableMetaData.ITEM_NAME);
    int iamount = c.getColumnIndex(ContentProviderMetaData.DepotTableMetaData.ITEM_AMOUNT);
    int iunit = c.getColumnIndex(ContentProviderMetaData.DepotTableMetaData.ITEM_UNIT);
    int ippu = c.getColumnIndex(ContentProviderMetaData.DepotTableMetaData.ITEM_PPU);
    int itotal = c.getColumnIndex(ContentProviderMetaData.DepotTableMetaData.ITEM_TOTAL);
    int icomment = c.getColumnIndex(ContentProviderMetaData.DepotTableMetaData.ITEM_COMMENT);


        //Gather values
        String id = c.getString(Integer.parseInt(queryid.toString()));

        String name = c.getString(iname);
        String amount = c.getString(iamount);
        String unit = c.getString(iunit);
        String ppu = c.getString(ippu);
        String total = c.getString(itotal);
        String comment = c.getString(icomment);
        String qrcode = c.getString(iqrcode);

        String[] info = new String[]{id,name,amount,unit,ppu,total,comment,qrcode};

4 个答案:

答案 0 :(得分:12)

moveToFirst会将您带到第一个(也是唯一的)结果。下一次调用moveToNext会将您带到第二个不存在的结果(索引1)。

尝试删除c.moveToNext();

答案 1 :(得分:1)

移动cursor.moveToFirst();,你就在那里。由于moveToFirst()将光标指针带到第一条记录,这就是你需要的。在您执行moveToNext()之后,请不要像在代码段中那样moveToFirst()

答案 2 :(得分:0)

您需要在帖子中包含更多信息;代码显示正在使用的变量,但我们不知道它们是什么(uri,project,sQueryid等)。你有一个sQueryid字符串,并且还试图将一个名为queryid的变量的String值发送到parseInt方法 - 这些变量是否相同,是否有拼写错误?如果没有,你应该尝试替代命名,这样就不那么容易混淆了。

我们也看不出这个代码是什么方法;你提到你在点击ListView时遇到问题,但这是代码所在的位置吗?如果是这样,在Cursor上调用moveToFirst()和/或moveToNext()就不是你想要的了,你不会通过在那里调用managedQuery来获取光标。相反,您需要使用传入方法的位置信息和ListView的适配器。有了更多的代码,我可以举个例子。

如果你只是试图遍历Cursor查询中的所有行,你可能想要做这样的事情:

while (c.moveToNext()) {
    String name = c.getString(c.getColumnIndex(ContentProviderMetaData.DepotTableMetaData.ITEM_NAME));
    String amount = c.getString(c.getColumnIndex(ContentProviderMetaData.DepotTableMetaData.ITEM_AMOUNT));
    // ...
    // do something with the data for this row
}

修改(根据评论中列出的代码):

我认为您的问题在于您传递给ShowActivity家伙的身份证明。在ShowActivity类中,为Cursor SimpleCursorAdapter上的ListView创建一个类级变量,以便您可以使用其他方法访问它。所以,像:

public class ShowActivity extends ListActivity implements OnItemClickListener {
    Cursor mCursor;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // ...
        mCursor = managedQuery(ContentProviderMetaData.DepotTableMetaData.CONTENT_URI, projection, null, null, ContentProviderMetaData.DepotTableMetaData.DEFAULT_SORT_ORDER);
        // ...
        SimpleCursorAdapter simpleadapter = new SimpleCursorAdapter(this,R.layout.list_entry, mCursor, columns, to);
        // ...

然后,您的onItemClick方法看起来像这样:

public void onItemClick(AdapterView<?> adapterView, View target, int position, long id) {
    Log.d("ShowActivity", "clicked @ " + position);
    mCursor.moveToPosition(position);
    final String itemId = mCursor.getString(mCursor.getColumnIndex(ContactsContract.Contacts._ID));
    Intent openAdvanced = new Intent(ShowActivity.this,AdvancedViewActivity.class);
    openAdvanced.putExtra("ID", itemId);
    startActivity(openAdvanced);
}

答案 3 :(得分:0)

在我开始编码之后我就停止了这个问题

if (c != null ) {
    Cursor c = sql.rawQuery("SELECT...");
    c.moveToFirst();
    for (int i = 0; i < c.getCount(); i++) {
        //do something
    c.moveToNext();
    }
}