A parameterized query raises an IllegalArgumentException: argument cannot be bound

I am trying to get information from my SQLite for the login page for an Android application. Code to extract from db:

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(); } }); 

But I keep getting this error:

 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) 
+4
source share
3 answers

Do not put the replacement character in quotation marks:

 WHERE name=? AND password=? 

Using name='?' will try to compare name with a literal question mark ...

+20
source

By not answering the question that you asked, but the question that you have not asked ... you are executing a database operation in the user interface thread. This is definitely not a way to do this, consider using AsyncTask to put this database operation code, rather than onClick.

+5
source

I also got a similar error.

The problem was the spaces around the equal operator.

Bug fixed by removing spaces from WHERE fieldName = ? before WHERE fieldName=?

+2
source

Source: https://habr.com/ru/post/1468826/


All Articles