проверьте, существует ли электронная почта, перед созданием пользовательского firebase android - PullRequest
0 голосов
/ 25 октября 2018

Итак, у меня проблема в том, что у меня есть форма регистрации, в которую пользователи вводят информацию (которая также содержит электронную почту).

У меня есть метод onClick, который называется

public void onCreateAccount(View view);   

, когдапользователь нажимает «Зарегистрировать», он проверяет поля в форме.

public class Foo extends AppCompatActivity {
//OTHER PRIVATE MEMBERS
private EditText etEmail;
boolean isValid;
private DatabaseReference databaseUser = FirebaseDatabase.getInstance().getReference().child("User");

@Override
protected void onCreate(Bundle savedInstanceState) {
   //DOES SOME INITIALIZATION
}

public void onCreateAccount(View view){
   String email = etEmail.getText().toString().trim();

   if(validateEmail(email)){
      String id = databaseUser.push().getKey();
        User user = new User(id, email);
        databaseUser.child(user.getId()).setValue(user);
        Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
        intent.putExtra("isCreateAccount", true);
        startActivityForResult (intent,0);
   }
}

private boolean validateEmail(String email) {
   isValid = true; 
   databaseUser.orderByChild("email").equalTo(emailUserEntered).addListenerForSingleValueEvent(new ValueEventListener() {
                            @Override
                            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                                if(dataSnapshot.exists())
                                   isValid=false;

                            }

                            @Override
                            public void onCancelled(@NonNull DatabaseError databaseError) {

                            }
                        });
}

Прежде чем вставлять запись в базу данных Firebase, я хочу сначала проверить, существует ли электронная почта, до вставки.Поэтому человек, набравший адрес электронной почты = a@mail.com, не допустит этого.

enter image description here

Ответы [ 3 ]

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

Иметь индекс в поле электронной почты.Затем вы можете сделать запрос, чтобы найти по электронной почте.

Это улучшит производительность, так как нет необходимости перебирать детей.

Что-то вроде:

orderByChild('email').equalTo(email).once('value').exist();
0 голосов
/ 25 октября 2018

Данные загружаются из Firebase асинхронно, что делает невозможным использование метода, подобного boolean validateEmail(String email) на Android.Загрузка данных из базы данных должна быть блокирующей операцией, чтобы включить такой метод, и Android не позволяет блокировать операции (так как это приведет к неработоспособности телефона).

Так что вместо этого вы должны * либо(переместите код для создания пользовательского в validateEmail или передачи в пользовательском интерфейсе, который затем вызывается после возвращения результата из базы данных. Код для последнегониже.

Сначала мы создадим пользовательский интерфейс, который вы можете реализовать в любом месте, где вам нужно проверить, существует ли пользователь.

public interface UserExistsCallback {
  void onCallback(boolean value);
}

Этот интерфейс может быть как конкретным, так и общимвы хотите. Это очень похоже на ValueEventListener в Firebase, но этот интерфейс предназначен только для вашего собственного использования.

С помощью этого интерфейса мы можем определить метод validateEmail следующим образом:

private void validateEmail(String email, final UserExistsCallback callback) {
   isValid = true; 
   databaseUser.orderByChild("email").equalTo(emailUserEntered)
       .addListenerForSingleValueEvent(new ValueEventListener() {
           @Override
           public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
               callback.onCallback(dataSnapshot.exists())
           }

           @Override
           public void onCancelled(@NonNull DatabaseError databaseError) {
               throw databaseError.toException();
           }
       });
}

И затем вызвать его из onCreateAccount следующим образом:

public void onCreateAccount(View view){
   String email = etEmail.getText().toString().trim();

   validateEmail(email), new UserExistsCallback() {
      public void onCallback(boolean exists) {
         if (!exists) {
            String id = databaseUser.push().getKey();
            User user = new User(id, email);
            databaseUser.child(user.getId()).setValue(user);
            Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
            intent.putExtra("isCreateAccount", true);
            startActivityForResult (intent,0);
         }
      })
   }
}

Также см. Многие из (связанных) ответов ниже:

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

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

DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference().child("User");

boolean flag=false;

databaseReference.orderByChild("email").equalTo(emailUserEntered).addListenerForSingleValueEvent(new ValueEventListener() {
                                @Override
                                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                                    if(dataSnapshot.exists())
                                       flag=true;

                                }

                                @Override
                                public void onCancelled(@NonNull DatabaseError databaseError) {

                                }
                            });
        return flag;                    

Но если вы хотите, чтобы пользователь был остановлен от написания электронной почтыкоторый находится в базе данных на полпути, без аутентификации, это было бы довольно сложно.

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

РЕДАКТИРОВАТЬ:

Данные загружаются асинхронно из Firebase, поэтому вы должны поместить что-то подобное прямо в if(dataSnapshot.exists()), чтобы избежать проблемы, с которой вы сейчас сталкиваетесь.

if(validateEmail(email)){
      String id = databaseUser.push().getKey();
        User user = new User(id, email);
        databaseUser.child(user.getId()).setValue(user);
        Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
        intent.putExtra("isCreateAccount", true);
        startActivityForResult (intent,0);
   }

else
  Toast(YourActivity.this, "Email already exists", LENGTH_LONG).show();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...