我正在尝试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");
答案 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或您正在使用的任何内容重新运行它,如果您进行数据库更改(如列名称和内容)(至少在您还没有大量数据的情况下)