2013-03-12 2 views
4

Я пытаюсь получить некоторую информацию из моей базы данных SQLite для страницы входа для приложения для Android. Код для извлечения из БД:Параметрированный запрос throws IllegalArgumentException: не удается связать аргумент

login.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      SQLiteDatabase db = SQLiteDatabase.openDatabase("/data/data/com.example.androidproject/databases/myDB", null, 0); 
      // Check Login 
      String username = usernamelogin.getText().toString(); 
      String password = loginpassword.getText().toString(); 

      Cursor c = db.rawQuery("SELECT name, password FROM User WHERE name='?' AND password='?'", new String[] {username, password}); 
      if(c.moveToFirst()) { 
       Intent intent=new Intent(Login.this, MainActivity.class); 
       startActivity(intent); 
      } else { 
       Toast.makeText(getApplicationContext(), "Invalid", Toast.LENGTH_LONG).show(); 
      } 
      c.close(); 
      db.close(); 
     } 
    }); 

Но я получаю эту ошибку:

03-12 20:38:40.216: E/AndroidRuntime(691): FATAL EXCEPTION: main 
03-12 20:38:40.216: E/AndroidRuntime(691): java.lang.IllegalArgumentException: Cannot bind argument at index 2 because the index is out of range. The statement has 0 parameters. 
03-12 20:38:40.216: E/AndroidRuntime(691): at android.database.sqlite.SQLiteProgram.bind(SQLiteProgram.java:212) 
03-12 20:38:40.216: E/AndroidRuntime(691): at android.database.sqlite.SQLiteProgram.bindString(SQLiteProgram.java:166) 
03-12 20:38:40.216: E/AndroidRuntime(691): at android.database.sqlite.SQLiteProgram.bindAllArgsAsStrings(SQLiteProgram.java:200) 
03-12 20:38:40.216: E/AndroidRuntime(691): at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:47) 
03-12 20:38:40.216: E/AndroidRuntime(691): at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1314) 
03-12 20:38:40.216: E/AndroidRuntime(691): at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1253) 
03-12 20:38:40.216: E/AndroidRuntime(691): at com.example.androiddiet.Login$2.onClick(Login.java:61) 
03-12 20:38:40.216: E/AndroidRuntime(691): at android.view.View.performClick(View.java:4084) 
03-12 20:38:40.216: E/AndroidRuntime(691): at android.view.View$PerformClick.run(View.java:16966) 
03-12 20:38:40.216: E/AndroidRuntime(691): at android.os.Handler.handleCallback(Handler.java:615) 
03-12 20:38:40.216: E/AndroidRuntime(691): at android.os.Handler.dispatchMessage(Handler.java:92) 
03-12 20:38:40.216: E/AndroidRuntime(691): at android.os.Looper.loop(Looper.java:137) 
03-12 20:38:40.216: E/AndroidRuntime(691): at android.app.ActivityThread.main(ActivityThread.java:4745) 
03-12 20:38:40.216: E/AndroidRuntime(691): at java.lang.reflect.Method.invokeNative(Native Method) 
03-12 20:38:40.216: E/AndroidRuntime(691): at java.lang.reflect.Method.invoke(Method.java:511) 
03-12 20:38:40.216: E/AndroidRuntime(691): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
03-12 20:38:40.216: E/AndroidRuntime(691): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
03-12 20:38:40.216: E/AndroidRuntime(691): at dalvik.system.NativeStart.main(Native Method) 

ответ

20

Не заворачивайте характер замены в кавычки:

WHERE name=? AND password=? 

Использование name='?' будет попробуйте сравнить name с буквально знак вопроса ...

+0

Да! большое спасибо :) – hamod90

+0

Рад, что я мог бы помочь, пожалуйста, нажмите галочку в этом ответе, чтобы принять его в качестве решения. – Sam

5

Не отвечая на вопрос, который вы задали, но вопрос, который вы еще не задали ... вы выполняете операцию базы данных в потоке пользовательского интерфейса. Это определенно не способ сделать это, подумайте об использовании AsyncTask для размещения этого кода операции базы данных, а не в onClick.

2

У меня также была аналогичная ошибка.

Вопрос был о пространстве вокруг равного оператора.

Исправлена ​​ошибка, удаляя пробелы из WHERE fieldName = ? в WHERE fieldName=?

Смежные вопросы