2015-10-22 94 views
2
public int getUserCred(User user){ 
database = opener.getReadableDatabase(); 

String first = user.getFirst(); 
String pass = user.getPassword(); 
String[] cols = {COL_FIRST, COL_PASS}; 

userCursor = database.query(TABLE_USER, cols, null, null, null, null, null); 

if(userCursor != null & userCursor.moveToFirst()) { 
     String firstName = userCursor.getString(userCursor.getColumnIndex(COL_FIRST)); 
     String password = userCursor.getString(userCursor.getColumnIndex(COL_PASS)); 
      if(first.equals(firstName) & pass.equals(password)){ 
       return User.CRED_CORRECT; 
       } 
      } 

    database.close(); 
    userCursor.close(); 
    return User.CRED_INCORRECT; 
} 

這是我的代碼,因爲它是現在,雖然illegalStateException不斷向我拋出,說它不能訪問第0行col -1。現在我知道其實數據保存在光標中,因爲cursor.getString(0)cursor.getString(1)正在返回數據,但使用cursor.getColumnIndex(COL_(FIRST/PASS))會不斷提高異常。任何想法爲什麼我的getColumnIndex()通過android返回-1?

有人請向我解釋爲什麼這樣對我?最初我在一個接口中保存了所有SQLite模式語句,這是我認爲是由於某種原因導致問題的原因,但是將它們放入嵌套類中引發了相同的異常,所以我決定在SQLiteOpenHelper子類中將它們變爲類變量。但是,這仍然沒有改變我的情況getColumnIndex()。 所以如果有人能指出我正確的方向,我會非常感激!

+1

「COL_FIRST」和「COL_PASS」的值是什麼? – dave

+0

@dave COL_FIRST =「FIRSTNAME」COL_PASS =「PASSWORD」;與領先的空白。 – 3alto

+1

你能列出TABLE_USER表中的列名嗎?看起來'COL_FIRST'和'COL_PASS'不匹配表中的那些列。 – shhp

回答

0

COL_FIRST =「FIRSTNAME」COL_PASS =「PASSWORD」;與領先的空格

問題是空白和實施細節。

當字符串用作SQL字符串的一部分時,額外的空格並不重要。這在使用例如在query() - 本質上args連接在一起形成一個SQL字符串和sqlite正確解析它,即使有額外的空白。

Cursor#getColumnIndex()是一種界面方法,但讓我們假設通常的SQLiteCursor implementation。它不適用於SQL級別。 sqlite報告的列名和索引放在Map中,然後用給定的列名查找。這意味着列名必須與完全匹配列名對於sqlite。具體來說:

  • 周圍的空白不是列名的一部分。

  • Map按鍵查找區分大小寫,而SQL本身不是。