Как я могу решить свои проблемы со входом в Android?

(Мой родной язык не английский. Возможно, в этом вопросе есть неправильная грамматика.)

Когда я пытаюсь войти в свое приложение, это приложение всегда возвращает УСПЕХ, даже если я ввел неправильный пароль.

Сначала я создал таблицу БД (PERSON). Во-вторых, я создал метод (chkpPw), проверяющий PW. В-третьих, я использую этот метод двумя способами.

это то, что я хочу результат. 1. пустой ID или пустой PW => Пожалуйста, введите ваш ID или PW. 2. Неправильный идентификатор, неверный пароль или правильный пароль => Ваш идентификатор не существует. 3. Правильный идентификатор, неправильный пароль => Пожалуйста, проверьте свой пароль. 4. Правильный ID, правильный PW => Успех

Но теперь мое приложение вернуло их. 1. пустой ID или пустой PW => Пожалуйста, введите ваш ID или PW. 2. Неправильный идентификатор, неверный пароль или правильный пароль => Ваш идентификатор не существует. 3. Правильный идентификатор, неверный пароль => успех 4. Правильный ID, правильный PW => Успех

Мой SQL-запрос находит идентификатор, который существует в БД, не учитывая pw, даже если pw существует или нет....T_T....

это данные таблицы PERSON:

personID | pId | pPw
1 | apple111 | 11111111
2 | banana222 | 22222222
3 | peache333 | 33333333

DBHelper.java

public class DBHelper extends SQLiteOpenHelper {

private static final String KEY_NAME = "pId";

private static final int DATABASE_VERSION = 1;

public DBHelper(Context context) {
    super(context, "tryangleDB", null, DATABASE_VERSION);
}

@Override
public void onCreate(SQLiteDatabase db) {
    String personSql = "CREATE TABLE PERSON (" +
            "personID INTEGER PRIMARY KEY AUTOINCREMENT, " +
            "pId TEXT NOT NULL, " +
            "pPw TEXT NOT NULL, " +
            "pName TEXT NOT NULL, " +
            "pBirth TEXT NOT NULL, " +
            "pEmail TEXT NOT NULL, " +
            "pPhone TEXT NOT NULL, " +
            "pProfile BLOB, " +
             "cDate TEXT, " +
            "dDate TEXT)";

    db.execSQL(personSql);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    if (newVersion == DATABASE_VERSION) {
        db.execSQL("DROP TABLE IF EXISTS PERSON");
        onCreate(db);
    }
}


// check same id exists when user registers
public boolean chkpId (String pId){
    SQLiteDatabase db = this.getReadableDatabase();
    Cursor cursor = db.rawQuery("Select * from person where pId=?", new String[]{pId});
    if (cursor.getCount()==0) {
        return true;
    }
    else {
        return false;
    }
}

// when user tries to login, check pw with id
// ★Please help this part.
public boolean chkpPw (String pPw, String pId){
    SQLiteDatabase db = this.getReadableDatabase();

    Cursor cursor = db.rawQuery("Select ? from person where pId= ?", new String[]{pPw, pId});
    if (cursor.getCount()>0) {
        return true;
    }
    else {
        return false;
    }
}


//    // this is what I tried.
//    public boolean chkpPw(String pPw, String pId) {
//        SQLiteDatabase db = this.getReadableDatabase();
//        String[] columns = {pPw, };
//        String[] parms = {pId };
//
//        Cursor cursor = db.query(" PERSON ", columns, "pId = ?", parms, null, null, null);
//        try {
//            if (cursor.getCount() > 0) {
//                return true;
//                // 트루라는 자체가 일치하는 id를 찾았다는 것

//            } else {
//                return false;
//            }
//        } catch (Exception e) {
//            e.printStackTrace();
//            return false;
//        } finally {
//
//        }
//    }
}

Логинактивити.java

// skip upper part
        btnLogin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                pPw = etPw.getText().toString();
                pId = etId.getText().toString();
//                boolean chkpId = db.chkpId(pId);
                boolean chkpPw = db.chkpPw(pPw, pId);

                // 1
                if (pId.equals("") || pPw.equals("")) {
                    Toast.makeText(getApplicationContext(),"Please enter your ID or PW.",Toast.LENGTH_SHORT).show();
                }
                else{
                    try{//★ I think this part has some problems.



if (chkpPw) {
                            Toast.makeText(getApplicationContext(),"success",Toast.LENGTH_SHORT).show();
                        }
                        else if (!chkpPw) {
                            Toast.makeText(getApplicationContext(),"failed",Toast.LENGTH_SHORT).show();
                        }





// ★ these are what I tried
//                        if (chkpPw==false) {
//                            save();
//                            Intent intent = new Intent(LoginActivity.this, MainActivity.class);
//                            startActivity(intent);
//                        }

//                        if (chkpId==false&&(chkpPw==true||chkpPw==false)) {
//                            Toast.makeText(getApplicationContext(),"not exist ID",Toast.LENGTH_SHORT).show();
//                        }
//
//                        if (chkpId==true&&chkpPw==false) {
//                            Toast.makeText(getApplicationContext(),"wrong PW",Toast.LENGTH_SHORT).show();
//                        }
//                        if (chkpPw==true) {
//                            Toast.makeText(getApplicationContext(),"not matched PW to this ID",Toast.LENGTH_SHORT).show();
//                        }

//                        if (chkpId==false && chkpPw==false) {
//                            save();
//                            Intent intent = new Intent(LoginActivity.this, MainActivity.class);
//                            startActivity(intent);
//                        }

//                        else if (chkpId==false && chkpPw==true) {
//                            Toast.makeText(getApplicationContext(),"not matched to PW",Toast.LENGTH_SHORT).show();
//                        }

//                        else if (chkpId==true && chkpPw==true) {
//                            Toast.makeText(getApplicationContext(),"Please register.",Toast.LENGTH_SHORT).show();
//                        }

                        } catch (Exception e) {
                            e.printStackTrace();
                            Toast.makeText(LoginActivity.this, "something wrong", Toast.LENGTH_SHORT).show();
                        } finally {
    //                        save();
                        }

                    }
                }
            });
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
54
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вы проверяете, существуют ли идентификатор и пароль отдельно. Более подходящим подходом было бы сначала проверить, существует ли идентификатор, а затем существуют ли идентификатор и пароль обе. Вы, вероятно, захотите сделать что-то в следующем духе.

public boolean chkpPw (String pPw, String pId){
    SQLiteDatabase db = this.getReadableDatabase();

    Cursor cursor = db.rawQuery("Select * from person where pPw=? and pId=?", new String[]{pPw, pId});
    if (cursor.getCount()>0) {
        return true;
    }
    else {
        return false;
    }
}

Спасибо. Ключевым моментом было ГДЕ pPw=? И pID=?. Я просто пытался найти правильный pid. Это знали все, кроме меня. хахаха

hailey 21.07.2019 09:12

Круто, проголосуйте, если это помогло, и отметьте ответ как правильный, если он сработал. Ваше здоровье.

Chrisvin Jem 21.07.2019 10:31

Измените запрос в методе chkpPw на

db.rawQuery("SELECT 1 FROM `person` WHERE `pPw`=? AND `pId`=?", new String[]{pPw, pId});

Идеальный ответ!!! Ключевым моментом было ГДЕ pPw=? И pId=?.... Я просто пытался найти правильный pid. Большое спасибо: Д

hailey 21.07.2019 09:09

Я думаю, что ваш метод db chkpPw неверен. Что вы делаете: выберите пароль, когда этот пользователь существует. Как вы могли заметить, этот запрос вернет хотя бы одну строку, если существует только id, поэтому вы возвращаете true, и метод говорит, что вы правы.

Хорошо, теперь давайте пройдемся по ответу.

Для проверки правильности пользователя и пароля вы можете попробовать, в соответствии с вашим кодом, это:

выберите * из вашей_таблицы, где id=? а пароль=?

Спасибо!! Я вообще не думал, что SQL неверен. Но ключевым моментом было ГДЕ pPw=? И pID=?.

hailey 21.07.2019 09:13

Другие вопросы по теме