2015-12-28 38 views
0

请求索引-1我正在试验Android中的SQLite数据库,我有一个简单但真正烦人的问题。我得到下面的异常而runnign我的代码:CursorIndexOutOfBoundsException:即使在使用moveToFirst()

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

i认为getColumnIndex()区分大小写。检查数据库中列密码的名称。是大写还是小写? – seba123neo

+0

这是ACCOUNTS表的创建字符串,所有内容都以大写字母写入:CREATE TABLE ACCOUNTS(USERNAME TEXT,PASSWORD TEXT,personID INTEGER) –

+0

我必须出去。当我回来时,我会看看。看看这里http://www.tutorialspoint.com/android/android_sqlite_database.htm http://developer.android.com/reference/android/database/sqlite/package-summary.html –

回答

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重新运行它,或者如果您使用列名和内容进行数据库更改(至少在您还没有数据的情况下),则可以重新运行它。

+0

卸载应用程序,并重新安装新版本做了伎俩。谢谢! –

+0

好斑点的亚历山大。 –

0

您需要检查,如果游标不为空,然后移动到第一位。

Cursor result = db.rawQuery("SELECT PASSWORD FROM ACCOUNTS WHERE USERNAME = '" + username + "'", null); 

if (result != null) { 
    result.moveToFirst(); 
} 

我建议你做的另一件事是登录密码的结果:

string password = result.getString(1); 
// log password 

在你的餐桌,你已经错过了结束分号:

"CREATE TABLE ACCOUNTS (USERNAME TEXT, PASSWORD TEXT, personID INTEGER);" 
+0

我尝试过,但不幸的是没有帮助。其实我知道结果不是空的,因为异常告诉我“索引-1请求,大小为1”,这意味着大小是1,即不是空的。我的问题是moveToFirst()没有效果,即使调用它,游标的位置仍然是-1 ... –

+0

然后,你的查询一定有问题,看看我编辑@GellértKovács的权限密码会被散列,但我不知道你的db的完整范围 –

+0

感谢你的快速回复。 result.getString(0)是抛出异常的方法,所以我无法记录它。或者,也许我不明白你的意思。 –

相关问题