Отдельное действие для разных пользователей

#java #android #firebase #firebase-realtime-database

#java #Android #firebase #firebase-база данных в реальном времени

Вопрос:

У меня есть мой проект Android, в котором есть два разных типа пользователей: администратор и обычный пользователь. На самом деле я нашел решение здесь, а не конкретно решение, поскольку оно не работает для меня.

Главная Fragment.java

 public View onCreateView(@NonNull final LayoutInflater inflater, @Nullable final ViewGroup container, @Nullable Bundle savedInstanceState) {

    FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
    final String uid = user.getUid();
    Query userQuery = FirebaseDatabase.getInstance().getReference().child("User").child(uid).child("isAdmin");

    userQuery.addValueEventListener(new ValueEventListener() {

        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            String type = dataSnapshot.child("isAdmin").getValue().toString();

            if(type.equals("true")){

                loadMenuBeachAdmin();

                FloatingActionButton fab = (FloatingActionButton) homeView.findViewById(R.id.fab);
                fab.show();
      }
}
  

База данных

введите описание изображения здесь

Ошибка, которую я получаю:

 java.lang.NullPointerException: Attempt to invoke virtual method
        'java.lang.String java.lang.Object.toString()' on a null object reference at 
com.example.batangasbeachhousesfinal.HomeFragment$1.onDataChange(HomeFragment.java:92)
  

какая строка type = dataSnapshot.child("isAdmin").getValue().toString();

Комментарии:

1. Попробуйте поставить точку останова в этой строке и отладить значение DataSnapshot, DataSnapshot.child(«isAdmin»)… и попытайтесь увидеть, что происходит

2. @denis_lor возможно ли, что причина, по которой я получаю нулевую ссылку на объект, заключается в том, что я не смог получить uid прямо со страницы входа?

3. @Reymand ты пробовал мой ответ?

4. @PeterHaddad да, и это работает. спасибо за помощь. Это что-то вроде новшества. 🙂

Ответ №1:

Измените это:

  Query userQuery = FirebaseDatabase.getInstance().getReference().child("User").child(uid).child("isAdmin");
userQuery.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        String type = dataSnapshot.child("isAdmin").getValue().toString();
        if(type.equals("true")){
            loadMenuBeachAdmin();


            FloatingActionButton fab = (FloatingActionButton) homeView.findViewById(R.id.fab);
            fab.show();

   }
}
  

в это:

 Query userQuery = FirebaseDatabase.getInstance().getReference().child("User").child(uid);
userQuery.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        String type = dataSnapshot.child("isAdmin").getValue().toString();
        if(type.equals("true")){
            loadMenuBeachAdmin();


            FloatingActionButton fab = (FloatingActionButton) homeView.findViewById(R.id.fab);
            fab.show();

  }
}
  

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