Если в базе данных нет записи, if (dataSnapshot.getValue () == null) возвращает true, но также выполняет часть else после завершения части if. - PullRequest
0 голосов
/ 07 февраля 2019

У меня есть страница регистрации в моем приложении, и во время регистрации я проверяю, зарегистрировано ли имя в firebase или нет.И если имя уже присутствует, я получаю тост-сообщение («пользователь уже существует») по мере необходимости, но если есть новая запись, я могу зарегистрироваться идеально, но я также получаю тост-сообщение после регистрации.

Пожалуйста, используйте следующий код:

mFirebaseDatabase = FirebaseDatabase.getInstance().getReference().child("Registration");

mFirebaseDatabase.orderByChild("uname").
equalTo(name.getSelectedItem().toString().trim()).addValueEventListener(new ValueEventListener() {            

    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        if (dataSnapshot.getValue() == null) {
            if (TextUtils.isEmpty(userId)) {
                createUser(name.getSelectedItem().toString().trim(), 
                           designation.getSelectedItem().toString().trim(),
                           phone.getText().toString().trim(), 
                           email.getText().toString().trim(),
                           password.getText().toString().trim(),
                           email1.getText().toString().trim(),
                           phone1.getText().toString().trim(),
                           telephone.getText().toString().trim());
                 Intent login = new Intent(Register.this, Login.class);
                 startActivity(login);
             }
         } else {
             Toast.makeText(Register.this, "User already Registered", Toast.LENGTH_SHORT).show();
         }
     }

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

Итак, после регистрации я получаю сообщение «пользователь уже зарегистрирован»

Ответы [ 3 ]

0 голосов
/ 07 февраля 2019

То, что вы делаете неправильно, это то, что вы проверяете dataSnapshot.getValue () == null каждый раз

 @Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

if (dataSnapshot.getValue() == null) {
  ....
 }else{
      Toast.makeText(Register.this, "User already Registered", 
      Toast.LENGTH_SHORT).show();

 }
}

В этом случае, что происходит, когда вы впервые пришли, нет пользовательских данныхdataSnapshot.getValue () был нулевым, а затем вы создали пользователя с помощью вашего метода createUser (), и сразу после создания вашего пользователя firebase запускает обратный вызов в вашем методе onDataChange (DataSnapshot dataSnapshot), и на этот раз dataSnapshot.getValue () получает вашего пользователяданные и состояние, которое вы проверяете, переходят к управлению другой частью, и появляется тост.

OnDataChanged вызывается каждый раз, когда вы изменяете значение в своей базе данных на этой ссылке.

Вам необходимо изменить условие if и else, чтобы проверить, зарегистрирован пользователь или нет, если зарегистрировано, показывают литост еще зарегистрировать их.

0 голосов
/ 07 февраля 2019

Я думаю, что когда вы создаете нового пользователя и добавляете его в базу данных Firebase, прослушиватель onDataChange запускается еще раз.

Вы можете попробовать этот код, возможно, поможет вам:

boolean isUserCreated = false;
mFirebaseDatabase....addValueEventListener(new ValueEventListener() {            

@Override
public void onDataChange(...) {
    if (dataSnapshot.getValue() == null) {
        if (TextUtils.isEmpty(userId)) {
            isUserCreated = true;
            createUser(...) 
         }
     } else if (!isUserCreated) {
         Toast.makeText(Register.this, "User already Registered", Toast.LENGTH_SHORT).show();
     }
 }
... 
});

Примечание: Этот код является кратким.Вы должны обратить внимание на isUserCreated переменную и использование этого.

0 голосов
/ 07 февраля 2019

Это нормальное поведение.Из документов :

Важно: метод onDataChange () вызывается каждый раз, когда данные изменяются по указанной ссылке в базе данных, включая изменения дочерних элементов.Чтобы ограничить размер снимков, прикрепляйте их только на самом высоком уровне, необходимом для просмотра изменений.Например, присоединение слушателя к корню вашей базы данных не рекомендуется.

Таким образом, в первый раз, когда он проверяет, что пользователя нет, он создает его.Но, создав его, вы, вероятно, подтолкнете его к firebase, который снова вызывает onDataChanged, и вы увидите тост.

Если вы хотите выполнить его только один раз, измените addValueEventListener на addListenerForSingleValueEvent (проверьте конкретно раздел Прослушивание событий значения )

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