2015-12-28 39 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)是拋出異常的方法,所以我無法記錄它。或者,也許我不明白你的意思。 –

相關問題