Проблема при вставке нового пользователя в БД после проверки наличия электронной почты sqlite - PullRequest
0 голосов
/ 04 октября 2018

Я пытаюсь предотвратить двойную вставку пользователей в БД, и когда я проверяю электронную почту каждый раз, когда получаю сообщение:

my email already exists

Спасибо за ответ.

Проверьте, существует ли userEmail: DataBaseHelper класс:

public boolean checkIfExists(String userEmail){
    db = this.getReadableDatabase();

    String query = "select "+ COL_EMAIL + " from " +TABLE_NAME;
    Cursor cursor = db.rawQuery(query, null);
    String existEmail;

   if (cursor.moveToFirst()) {
        do {
            existEmail = cursor.getString(0);

            if (existEmail.equals(userEmail)) {
                return true;
            }
        } while (cursor.moveToNext());
    }
    return false;
}

Подтвердите адрес электронной почты, проверьте, существует ли адрес электронной почты: Registration класс:

private boolean validateEmail() {
    String emailInput = textInputEmail.getEditText().getText().toString().trim();

    if (myDb.checkIfExists(emailInput)) {
        textInputEmail.setError("Email already exist");
        return false;
    } else if (emailInput.isEmpty()) {
        textInputEmail.setError("Field can't be empty");
        return false;
    } else if (!Patterns.EMAIL_ADDRESS.matcher(emailInput).matches()) {
        textInputEmail.setError("Please enter a valid email address");
        return false;
    } else {
        textInputEmail.setError(null);
        return true;
    }
}

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

Я думаю, что вы должны отлаживать свой код с помощью Android Studio Debugger.Это очень мощный инструмент, и я думаю, что он поможет вам решить эту проблему.Если вы не можете использовать отладчик, вы можете вставить System.out.println в интересующие строки.

Возможно, я бы сделал это так (но использование отладчика намного лучше):

public boolean checkIfExists(String userEmail){

    System.out.println("INPUT: " + userEmail);
    db = this.getReadableDatabase();

    String query = "select "+ COL_EMAIL + " from " +TABLE_NAME;
    Cursor cursor = db.rawQuery(query, null);
    String existEmail;

   if (cursor.moveToFirst()) {
        do {

            existEmail = cursor.getString(0);
            System.out.println("Checking email " + existEmail);
            if (existEmail.equals(userEmail)) {
                return true;
            }
        } while (cursor.moveToNext());
    }
    return false;
}

private boolean validateEmail() {
    String emailInput = textInputEmail.getEditText().getText().toString().trim();
    System.out.println("Email is " + emailInput);

    if (myDb.checkIfExists(emailInput)) {
        textInputEmail.setError("Email already exist");
        return false;
    } else if (emailInput.isEmpty()) {
        textInputEmail.setError("Field can't be empty");
        return false;
    } else if (!Patterns.EMAIL_ADDRESS.matcher(emailInput).matches()) {
        textInputEmail.setError("Please enter a valid email address");
        return false;
    } else {
        textInputEmail.setError(null);
        return true;
    }
}

Также я хочу обратить ваше внимание на следующие моменты (вы можете просто пропустить это, потому что это только мои мысли):
1) В checkIfExists методе вы выбираете ВСЕ сохраненные электронные письма каждый раз, когда вам нужно проверить толькоодин раз.Я думаю, что было бы лучше, если бы вы написали sql-запрос для выбора только конкретного письма, используя выражение WHERE.
2) В вашем методе validateEmail вы проверяете emailInput.isEmpty() и !Patterns.EMAIL_ADDRESS.matcher(emailInput).matches() ПОСЛЕ Вы проверяете электронную почту в БД.Но это следует проверять в первую очередь потому, что если электронная почта пуста или недействительна с точки зрения формата, мы не можем проверить ее в БД, потому что это, вероятно, не электронная почта:))

0 голосов
/ 04 октября 2018

Ваш код, кажется, в порядке, но вы не должны этого делать, поскольку может произойти другая вставка, пока вы выполняете итерацию по всему вашему списку email.Лучше создать поле email с включенным ограничением UNIQUE, а затем выполнить прямую вставку в БД для создания электронного письма.Это приведет к исключению в случае, если email уже существует, который вы можете перехватить и обработать соответствующим образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...