Cannot bind argument at index 2 because the index is out of range. The statement has 0 parameters

445
21 декабря 2016, 00:23
E/AndroidRuntime: FATAL EXCEPTION: main
Process: home.partyfinder3, PID: 8459
java.lang.IllegalArgumentException: Cannot bind argument at index 2 because the index is out of range.  The statement has 0 parameters.
  at android.database.sqlite.SQLiteProgram.bind(SQLiteProgram.java:212)
  at android.database.sqlite.SQLiteProgram.bindString(SQLiteProgram.java:166)
  at android.database.sqlite.SQLiteProgram.bindAllArgsAsStrings(SQLiteProgram.java:200)
  at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:47)
  at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1316)
  at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1255)
  at home.partyfinder3.LoginActivity.onClick(LoginActivity.java:51)
  at android.view.View.performClick(View.java:4780)
  at android.view.View$PerformClick.run(View.java:19866)
  at android.os.Handler.handleCallback(Handler.java:739)
  at android.os.Handler.dispatchMessage(Handler.java:95)
  at android.os.Looper.loop(Looper.java:135)
  at android.app.ActivityThread.main(ActivityThread.java:5254)
  at java.lang.reflect.Method.invoke(Native Method)
  at java.lang.reflect.Method.invoke(Method.java:372)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

Вот такой exception вылетает, когда нажимаю кнопку "Войти". Обработчик:

public void onClick(View v) {
    String username = etUsername.getText().toString();
    String password = etPassword.getText().toString();
    db = dbHelper.getWritableDatabase();
    switch (v.getId()) {
        case R.id.btnLogin:
            Cursor c = db.rawQuery("SELECT username FROM users WHERE username='?' AND password='?'", new String[] {username, password});
            if(c.moveToFirst()) {
                Toast.makeText(this, R.string.login_enjoy, Toast.LENGTH_LONG).show();
                startActivity(new Intent(this, MainActivity.class).putExtra("username", username));
                c.close();
            } else {
                Toast.makeText(this, R.string.login_error, Toast.LENGTH_LONG).show();
            }
            break;
        case R.id.btnLinkToRegisterScreen:
            startActivity(new Intent(this, RegisterActivity.class));
            break;
    }
    dbHelper.close();
}

Где что не так?

Answer 1

Сделайте консоль-лог сформированного запроса к базе и попробуйте его скопировать и выполнить вручную непосредственно в интерфейсе базы данных sql. Если там запрос не отработает, то хоть будет видна реальная причина.

Answer 2

Уберите из текста запроса одинарные кавычки.

READ ALSO
Что значит тестовое задание “в 2 экрана”? [требует правки]

Что значит тестовое задание “в 2 экрана”? [требует правки]

Отправил резюме, получил в ответ вопрос: "готовы ли вы выполнить небольшое тестовое задание в 2 экрана?"

256
Приложение крашится из-за background service

Приложение крашится из-за background service

Доброго времени суток, суть проблемы:

265
Interface с реализацией

Interface с реализацией

Я во всех учебниках видел, читал, тестировал interface с методами без реализацииНо вот копаюсь в дереве и тут есть методы с реализацией default

256
DrawerLayout cannot be cast to LinearLayout при вызове диалогового окна

DrawerLayout cannot be cast to LinearLayout при вызове диалогового окна

Этот вопрос является продолжением темы Создание всплывающего окна с произвольным содержимымВ том вопросе было предложено такое решение:

263