如何解决CursorIndexOutOfBounds

时间:2011-11-21 12:29:01

标签: java android sqlite

到目前为止,这让我很难过。

尝试运行此特定查询时,我一直收到CursorIndexOutOfBounds。

    Cursor c = db.rawQuery("SELECT * FROM table WHERE _id='2'" , null);

但奇怪的是,我正在运行一个循环来输出该表中的所有_id值。它输出1到100所以我知道价值在那里。我也输出了所有列,它们就像我期望的那样。

即使我非常确定有值,但在正确的列中,这行代码仍能保持CursorIndexOutOfBounds。任何人都可以提出解决这个问题的途径。

    numval = c.getInt(c.getColumnIndex("_id"));

Logcat条目

11-21 11:35:09.367: ERROR/AndroidRuntime(11664): Caused by: android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0

修改

这是我正在运行的确切代码。我仍然收到我在这句话上方发布的错误。

    Cursor cur = db.rawQuery("SELECT * FROM table" , null);
    cur.moveToFirst();
    while (cur.isAfterLast() == false) {

        numval = cur.getInt(cur.getColumnIndex("_id"));
        String numvalval = Integer.toString(numval);
        Log.e("RESULT",numvalval);
        cur.moveToNext();
    }
    cur.close();
    Cursor ti = db.rawQuery("PRAGMA table_info(table)", null);
    if ( ti.moveToFirst() ) {
        do {
            Log.e("COLUMN NAMES","col: '" + ti.getString(1) +"'");
        } while (ti.moveToNext());
    }
    ti.close();
    Cursor c = db.rawQuery("SELECT * FROM table WHERE _id='2'" , null);
    c.moveToFirst();
                numval      = c.getInt(c.getColumnIndex("_id"));

正在输出

11-21 13:27:25.906: ERROR/RESULT(13377): 1
11-21 13:27:25.906: ERROR/RESULT(13377): 2
11-21 13:27:25.910: ERROR/COLUMN NAMES(13377): col: '_id'
11-21 13:27:25.910: ERROR/COLUMN NAMES(13377): col: 'country'

4 个答案:

答案 0 :(得分:2)

请参阅编辑,编辑问题后,以下建议无效。

当你得到一个Cursor对象时,你应该始终把它移到第一行。所以你的代码应该是这样的:

if(c.moveToFirst()) {
    numval = c.getInt(c.getColumnIndex("_id"));
}
else {
    /* SQL Query returned no result ... */
}

修改
将您的查询更改为此(不包括'2'周围的引号):

Cursor c = db.rawQuery("SELECT * FROM table WHERE _id=2" , null);

答案 1 :(得分:0)

这意味着您访问不存在的索引numval = c.getInt(c.getColumnIndex("_id"));首先检查您的光标是否为空if(c==null)if(c.getCount>0)

答案 2 :(得分:0)

尝试在c.moveToFirst();

之前使用numval = c.getInt(c.getColumnIndex("_id"));

答案 3 :(得分:0)

while (cur.isAfterLast() == false) {

不是正确的方法

while (cur.moveToNext()) {

另外,Cursor有更具体的方法来实现rawQuery,你应该使用这些