Ошибка входа в базу данных с базой данных Firebase - PullRequest
0 голосов
/ 01 октября 2019

Я занимаюсь проектом под названием электронная школа. У него 4 типа пользователей, которые используют аутентификацию Firebase и базу данных Firebase в реальном времени для входа в свои учетные записи. В любом случае, у меня возникают проблемы при работе с базой данных Firebase в реальном времени и аутентификацией Firebase. Я позволяю пользователям соответствующих панелей сравнивать данные аутентификации с базой данных в реальном времени.

// Регистрационный код

     auth.createUserWithEmailAndPassword(email.getText().toString(), password.getText().toString())
                    .addOnSuccessListener(new OnSuccessListener<AuthResult>() {
                @Override
                public void onSuccess(AuthResult authResult) {
                    Users user = new Users();
                    user.setE_mail(email.getText().toString());
                    user.setNumber(Phone.getText().toString());
                    user.setPassword(password.getText().toString());

                    user.setU_name(username.getText().toString());

                    users.child("principal").child(FirebaseAuth.getInstance().getCurrentUser().getUid())
                            .setValue(user)
                            .addOnSuccessListener(new OnSuccessListener<Void>() {
                        @Override
                        public void onSuccess(Void aVoid) {
                            Snackbar.make(rootLayout, "Registration Success",Snackbar.LENGTH_LONG)
                                    .show();
                            return;
                        }
                    }).addOnFailureListener(new OnFailureListener() {
                        @Override
                        public void onFailure(@NonNull Exception e) {

                            Snackbar.make(rootLayout, "Registration Failed: "+e.getMessage(), Snackbar.LENGTH_LONG)
                                    .show();
                            return;

                        }
                    });
                }
            }).addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    Snackbar.make(rootLayout, "Failed :"+e.getMessage(),Snackbar.LENGTH_LONG)
                            .show();
                    return;
                }
            });

        }
    });

// Код входа

     auth.signInWithEmailAndPassword(t_email.getText().toString(), t_password.getText().toString())
                    .addOnSuccessListener(new OnSuccessListener<AuthResult>() {
                        @Override
                        public void onSuccess(AuthResult authResult) {
                             id = auth.getUid();
                            teacherValidation(id);




                        }
                    }).addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {

                    Snackbar.make(rootLayout,"Authentication Failed", Snackbar.LENGTH_SHORT).show();
                }
            });

// TeacherValidate

     private void teacherValidation(final String id) {

    users = db.getInstance().getReference("Users/teachers");

    users.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

            if(dataSnapshot.getKey().equals(id)){
                Toast.makeText(MainActivity.this," "+id,Toast.LENGTH_SHORT).show();
                    Intent it = new Intent(MainActivity.this, teachers.class);
                    it.putExtra("UID", id);
                    startActivity(it);
                    finish();

            }else{

                Toast.makeText(MainActivity.this, "No Teacher Esxist With the Given Credientialss", Toast.LENGTH_SHORT).show();

            }

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


        }
    });

}

Ответы [ 2 ]

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

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

Просто измените метод teacherValidation следующим образом.

private void teacherValidation(final String id) {

    users = db.getInstance().getReference("Users/teachers").child(id);

    users. addListenerForSingleValueEvent(new ValueEventListener() {
      @Override
      public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

        // If below condition checks true, 
        // that means user exists on teacher node, so probably he/she is a teacher.
        if(dataSnapshot.getValue() != null){
            Toast.makeText(MainActivity.this," "+id,Toast.LENGTH_SHORT).show();
                Intent it = new Intent(MainActivity.this, teachers.class);
                it.putExtra("UID", id);
                startActivity(it);
                finish();

        }else{
            Toast.makeText(MainActivity.this, "No Teacher Exist With the Given Credientialss", Toast.LENGTH_SHORT).show();
        }

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


        }
      });
}
0 голосов
/ 01 октября 2019

Я получил этот фрагмент кода. Вероятно, addListenerForSingleValueEvent является вашим методом.

Обратите особое внимание на способ построения запроса, вызывая первого дочернего элемента, который называется таблицей «users», а затем второго дочернего элемента, который является пользователем с определенным userId. ,FUser эквивалентен вашему классу Users.

Попробуйте это ...

    private void getFirebaseUserInfo(final String userId, final GetUserInfoListener userInfoListener) {

    DatabaseReference userIdReference = getDatabaseReference().child("users").child(userId);
    userIdReference.addListenerForSingleValueEvent(new ValueEventListener() {

        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

            try {
                final Users user = dataSnapshot.getValue(FUser.class);
                if (!user.email.isEmpty()) {
                    // Do whatever
                } else {
                    userInfoListener.onSuccess(user);
                }

            } catch(DatabaseException e) {
                userInfoListener.onFailure(new Exception(e.getMessage()));
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            userInfoListener.onFailure(new Exception(databaseError.getMessage()));
        }
    });
}

Также обратите внимание на разницу: Разница между addValueEventListener () и addListenerForSingleValueEvent () в firebase

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