Sqlite - 请求索引0,大小为0

时间:2015-11-08 21:32:00

标签: android sqlite cursor indexoutofboundsexception

我试图从我的数据库中获取一个联系人,我继续请求索引0,大小为0错误。

这是我的代码:

// Getting single contact
Contact getContact(int id) {
    SQLiteDatabase db = this.getReadableDatabase();
    Cursor cursor = db.query(TABLE_NAME, new String[]
                    { COLUMN_ID, COLUMN_FULLNAME, COLUMN_PHONE, COLUMN_EMAIL, COLUMN_ADDRESS, COLUMN_SITE, COLUMN_BIRTHDAY },
                    COLUMN_ID + "=?",
                    new String[] { String.valueOf(id) }, null, null, null, null);


    if (cursor != null)
        cursor.moveToFirst();

        Contact contact = new Contact(
            Integer.parseInt(cursor.getString(0)),
            cursor.getString(1),
            cursor.getString(2),
            cursor.getString(3),
            cursor.getString(4),
            cursor.getString(5),
            cursor.getString(6));
    db.close();
    cursor.close();
    return contact;
}

这是我得到的错误:

android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0

请帮助我了解该怎么做......

3 个答案:

答案 0 :(得分:1)

您的查询与任何数据都不匹配。

检查moveTo...()的结果以了解光标是否指向有效行:如果移动未成功,则方法调用返回false。要使查询匹配数据并返回行,请检查查询选择条件。

此外,SQLiteDatabase查询方法永远不会为null返回Cursor,因此!= null检查是多余的。

答案 1 :(得分:1)

编辑:尝试这种方法,它应该可以工作。

Contact getContact(int id) {
    Contact contact = null;
    String query = "SELECT * FROM " + TABLE_NAME + " WHERE " + COLUMN_ID + " = " + id;
    SQLiteDatabase db = this.getReadableDatabase();
    Cursor cursor = db.rawQuery(query, null);
    if(cursor.moveToFirst()) {
        cursor.moveToFirst();
        contact = new Contact(
                Integer.parseInt(cursor.getString(0)),
                cursor.getString(1),
                cursor.getString(2),
                cursor.getString(3),
                cursor.getString(4),
                cursor.getString(5),
                cursor.getString(6));
    }
    cursor.close();
    return contact;
}

也许改变:

if (cursor != null) 
    cursor.moveToFirst();

使用:

if(cursor.moveToFirst()) 

对于这个Android Reference on Cursor,如果光标是emtpy,则moveToFirst()返回false。

答案 2 :(得分:0)

可能是你的桌子是空的。

尝试将条件更改为

if (cursor.moveToFirst())
{

    Contact contact = new Contact(
        Integer.parseInt(cursor.getString(0)),
        cursor.getString(1),
        cursor.getString(2),
        cursor.getString(3),
        cursor.getString(4),
        cursor.getString(5),
        cursor.getString(6)); 
}