java.lang.IllegalArgumentExceptionIllegalArgumentException: значение привязки в индексе 2 является нулевым - PullRequest
0 голосов
/ 31 октября 2019

Я пытаюсь получить доступ к информации, хранящейся в базе данных, и отобразить ее, извлекая данные через cursor.getString () и устанавливая ее в Textview. Я вроде застрял в этом и помог мне

Databasehelper.java

public Cursor checkduplicates_in_user_credentials(String user_name, String password, String table) {
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor res = null;

        if (table.equals(TABLE_NAME_USER)) {
            res = db.rawQuery("select * from " + TABLE_NAME_USER  + " where username=? and password=? ", new String[]{user_name, password},null);
        }
        return res;
    }

Ошибка при запуске приложения

    Process: com.example.instacure, PID: 11556
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.instacure/com.example.instacure.Personal_Info}: java.lang.IllegalArgumentException: the bind value at index 2 is null
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3270)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016)
        at android.os.Handler.dispatchMessage(Handler.java:107)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7356)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
     Caused by: java.lang.IllegalArgumentException: the bind value at index 2 is null
        at android.database.sqlite.SQLiteProgram.bindString(SQLiteProgram.java:167)
        at android.database.sqlite.SQLiteProgram.bindAllArgsAsStrings(SQLiteProgram.java:203)
        at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:49)
        at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1443)
        at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1400)
        at com.example.instacure.DatabaseHelper.checkduplicates_in_user_credentials(DatabaseHelper.java:72)
        at com.example.instacure.Personal_Info.onCreate(Personal_Info.java:44)
        at android.app.Activity.performCreate(Activity.java:7802)
        at android.app.Activity.performCreate(Activity.java:7791)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1299)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3245)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409) 
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83) 
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016) 
        at android.os.Handler.dispatchMessage(Handler.java:107) 
        at android.os.Looper.loop(Looper.java:214) 
        at android.app.ActivityThread.main(ActivityThread.java:7356) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930) 

Здесь оно ссылается на

PersonalInfo.java

 Cursor y = db.checkduplicates_in_user_credentials(username, password, getResources().getString(R.string.user_credentials));


        if (y.moveToFirst()) {
            String name1 = y.getString(y.getColumnIndex("first_name"));
            String name2 = y.getString(y.getColumnIndex("last_name"));

            name.setText(name1+" "+name2);
            age.setText(y.getString(y.getColumnIndex("age")));
            email.setText(y.getString(y.getColumnIndex("e_mail")));
            pwd.setText(y.getString(y.getColumnIndex("password")));
            usrname.setText(y.getString(y.getColumnIndex("username")));
            phoneno.setText(y.getString(y.getColumnIndex("phone_number")));
            bloodgroup.setText(y.getString(y.getColumnIndex("blood_group")));
            gender.setText(y.getString(y.getColumnIndex("gender")));
            city.setText(y.getString(y.getColumnIndex("city")));
            utype.setText(y.getString(y.getColumnIndex("user_type")));


        }

1 Ответ

0 голосов
/ 31 октября 2019

java.lang.IllegalArgumentException: the bind value at index 2 is null говорит вам, что пароль равен null и поэтому не может использоваться для замены ( bind ) ? в запросе.

Вам нужно либо убедиться, что пароль никогда не будет нулевым, когда он получен, либо обработать его как нулевое.

Правильное исправление должно быть первым (код для получения пароля не указан, поэтому данное исправление не может быть предоставлено) . Тем не менее, следующее (обработайте его как ноль) может обойти основную проблему: -

public Cursor checkduplicates_in_user_credentials(String user_name, String password, String table) {
    SQLiteDatabase db = this.getReadableDatabase();
    Cursor res = null;
    if (password == null) password = "apassswordthatwouldneverbeusedbytheuser";
    if (table.equals(TABLE_NAME_USER)) {
        res = db.rawQuery("select * from " + TABLE_NAME_USER  + " where username=? and password=? ", new String[]{user_name, password},null);
    }
    return res;
}

Однако, может все еще иметь проблему, поскольку вызывающий код не обрабатывает нулевой Курсор, который может произойти, если таблица неравно TABLE_NAME_USER.

Итак, у вас должно быть что-то вроде: -

    Cursor y = db.checkduplicates_in_user_credentials(username, password, getResources().getString(R.string.user_credentials));

    if (y != null && y.moveToFirst()) { // will not try to moveToFirst if the Cursor is null
        String name1 = y.getString(y.getColumnIndex("first_name"));
        String name2 = y.getString(y.getColumnIndex("last_name"));

        name.setText(name1+" "+name2);
        age.setText(y.getString(y.getColumnIndex("age")));
        email.setText(y.getString(y.getColumnIndex("e_mail")));
        pwd.setText(y.getString(y.getColumnIndex("password")));
        usrname.setText(y.getString(y.getColumnIndex("username")));
        phoneno.setText(y.getString(y.getColumnIndex("phone_number")));
        bloodgroup.setText(y.getString(y.getColumnIndex("blood_group")));
        gender.setText(y.getString(y.getColumnIndex("gender")));
        city.setText(y.getString(y.getColumnIndex("city")));
        utype.setText(y.getString(y.getColumnIndex("user_type")));
    }

Теперь, когда вы обрабатываете нулевой Курсор, вместо того, чтобы иметь потенциальный непреднамеренный доступ, если пароль действительно будет apasssword, который никогда не будет использован пользователем , тогда вы можете вместо этого использовать: -

public Cursor checkduplicates_in_user_credentials(String user_name, String password, String table) {
    SQLiteDatabase db = this.getReadableDatabase();
    Cursor res = null;
    if (password == null) return null;
    if (table.equals(TABLE_NAME_USER)) {
        res = db.rawQuery("select * from " + TABLE_NAME_USER  + " where username=? and password=? ", new String[]{user_name, password},null);
    }
    return res;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...