CursorIndexOutOfBoundsException:即使在使用moveToFirst()

时间:2015-12-28 20:25:40

标签: android android-sqlite indexoutofboundsexception

我正在尝试Android中的SQLite数据库,我有一个简单但非常讨厌的问题。运行我的代码时出现以下异常:

android.database.CursorIndexOutOfBoundsException:请求索引-1,大小为1

正如您所看到的结果不为空(大小为1),我还调用result.moveToFirst()方法正确定位光标,但问题仍然存在。我也尝试在return语句之前使用result.moveToPosition(0)方法,但没有成功。

我的DatabaseHelper类中包含以下方法,它会使用return语句抛出异常。

public boolean authenticateUser(String username, String password) {
    SQLiteDatabase db = this.getWritableDatabase();
    Cursor result = db.rawQuery("SELECT PASSWORD FROM ACCOUNTS WHERE USERNAME = '" + username + "'", null);
    //no such username in the database
    if (!result.moveToFirst()) return false;
    return result.getString(result.getColumnIndex("PASSWORD")).equals(password);
}

我在数据库中有一个表,它是使用DatabaseHelper类的onCreate方法中包含的以下命令创建的:

db.execSQL("CREATE TABLE ACCOUNTS (USERNAME TEXT, PASSWORD TEXT, personID INTEGER)");   

db.execSQL("INSERT INTO ACCOUNTS VALUES('user1', 'user1', 1)");
db.execSQL("INSERT INTO ACCOUNTS VALUES('user2', 'user2', 2)");

我确认数据库已正确创建且数据已插入。

在我的MainActivity中,我有一个DatabaseHelper myDB变量。

myDB = new DatabaseHelper(this);

在某个时刻我称之为方法

myDB.authenticateUser("user1", "user1");

1 个答案:

答案 0 :(得分:1)

所以没有

    db.execSQL("CREATE TABLE ACCOUNTS (USERNAME TEXT, PASSWORD TEXT, personID INTEGER)");

我用过

    db.execSQL("CREATE TABLE ACCOUNTS (USERNAME TEXT, pwd TEXT, personID INTEGER)");

(注意密码的小写列名称)

然后

SQLiteDatabase db = this.getReadableDatabase(); Cursor result = db.rawQuery("SELECT pwd FROM ACCOUNTS WHERE USERNAME = '" + username + "'", null); //no such username in the database if (result == null || !result.moveToFirst()) return false; return result.getString(result.getColumnIndex("pwd")).equals(password);

一切似乎都运转得很好。然后我想'嘿,哎呀,这不应该发生'所以我把一切都还原到以前的样子。

瞧,一切都恢复正常。你确定你不是......在重新尝试之前没有删除数据库吗?您应该卸载该应用程序,然后从IDE或您正在使用的任何内容重新运行它,如果您进行数据库更改(如列名称和内容)(至少在您还没有大量数据的情况下)