2013-06-27 2 views
0

Я написал код для сравнения учетных данных пользователя в базе данных. Сначала я проверяю имя пользователя, а затем на основе возвращаемых результатов, я сравниваю пароль. Если оба совпадают, я открываю другое действие. Код мне кажется хорошим, но у меня нет опыта работы с базами данных, возможно, я пропустил здесь что-то важное. По какой-то причине следующий код не работает.Сравнение результатов, возвращаемых запросом База данных SQLite

public boolean Compare(String username, String pass) 
{ 
    Cursor c = sqlDB.query(DB_NAME, columns, DB_COL_EMAIL + "='" + username+ "'", null, null, null, null); 



    if(c!=null && c.getCount()>0) 
    { 
     Toast.makeText(context, "inside check", Toast.LENGTH_SHORT).show(); 
     c.moveToFirst(); 

     int passwordCol_number= c.getColumnIndex(DB_COL_PASS); 
     boolean found = false; 

     while(c.moveToNext()) 

     { 
      found = pass.equals(c.getString(passwordCol_number)); 

      if(found) 
       return true; 
     } 
    } 
return false; 
} 

Есть ли что-нибудь, что я делаю неправильно?

С уважением

+0

вывесить 'logcat' след, который вы получите, чтобы мы могли понять, что это ошибка, что вы столкнулись с – 7bluephoenix

+1

Не отвечая на ваш вопрос здесь, но вы действительно должны читать о инъекций SQL и хэширование паролей;) (и также соглашения об именах java) – Guillaume

ответ

1

Вы должны улучшить свой метод как

public boolean compareLogin(String username, String pass) { 
    String where = DB_COL_EMAIL + " = ? AND " + DB_COL_PASS + " = ?"; 
    String[] whereParams = new String[]{username, pass}; 

    Cursor mCursor = db.query(DB_NAME, columns, 
      where, 
      whereParams, 
      null, 
      null, 
       null); 

    if (mCursor != null && mCursor.moveToFirst()) 
     return true; 
    else 
     return false; 
} 

И да, вы должны прочитать о именования в Java или Android.

+0

что делает это? =? AND? вы можете прокомментировать – user2498079

+0

'where'' String' имеет '?' s в месте фактических значений, а фактические значения передаются как 'String []' и в параметре 'whereParams'. SQLite заменит эти '?' S значениями из 'String []' 'whereParams'. –

+0

Вы получили ответ? –

0

Единственное, что я вижу, что вы не закрываете курсор.

ли что-то вроде этого:

0

Это должно работать так, как вы хотите.

public boolean Compare(String username, String pass) { 
    Cursor c = sqlDB.query(DB_NAME, columns, DB_COL_EMAIL + "='" + username+ "'", null, null, null, null); 

    // No need to check c != null and c.getCount() 
    // c will not be null even if no rows returned. 

    boolean found = false; 
    // c.moveToFirst() will return false if no rows returned 
    // so this line should be sufficient 
    if (c.moveToFirst()) { 
     // while (c.moveToNext()) should be commented 
     // remember you just called moveToFirst()? 
     // moveToNext() will move to next row 
     // and will returned false if no more rows in the cursor 

     found = pass.equals(c.getString(passwordCol_number)); 
    } 
    c.close(); 
    return found; 
}