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

Sqlite - getting Index 0 requested, with a size of 0

我正在尝试从我的数据库中获取一个联系人,但我不断收到索引 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

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

您的查询没有匹配到任何数据。

检查 moveTo...() 的结果以了解游标是否指向有效行:如果移动不成功,方法调用 returns false。要使查询匹配数据和 return 行,请检查您的查询选择条件。

此外,SQLiteDatabase 查询方法从不 return null 用于 Cursor,因此 != null 检查是多余的。

编辑:试试这个方法,它应该有效。

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,moveToFirst() returns false if the cursor is emtpy.

可能是你的table是空的。

尝试将条件更改为

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)); 
}