NullPointerException при попытке получить данные из базы данных Firebase Realtime

Структура базы данных  введите описание изображения здесь

Я пытаюсь получить ссылку на пользователей из списка чатов. Что я пытаюсь сделать, так это то, что если пользователь вошел в систему, он увидит, что пользователи, упомянутые в разделе, это Uid в узле Chatlist внутри его recyclerview.

Я получаю исключение nullpointerexception в следующей строке

   DatabaseReference UserRef = rootRef.child("Users").child(chatlist.getId());

Исключение

 java.lang.NullPointerException: Can't pass null for argument 'pathString' in child()
    at com.google.firebase.database.DatabaseReference.child(com.google.firebase:firebase-database@@19.2.1:96)
    at com.shivam.chatapp2.Fragments.Chats.onCreateView(Chats.java:112)

MyCode

public class Chats extends Fragment {

private RecyclerView recyclerView;

private UserAdapter userAdapter;
private List<User> mUsers;

FirebaseUser fuser;
DatabaseReference reference;



FloatingActionButton profile, credentials;

ValueEventListener ChatListListener;
List<Chatlist> usersList;

private ChatsFragmentAdapter chatsFragmentAdapter;


public Chats() {
    // Required empty public constructor
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View view = inflater.inflate(R.layout.fragment_chats, container, false);

    profile = view.findViewById(R.id.fab_edit_profile_pic);
    credentials = view.findViewById(R.id.fab_edit_name);
    FabAction();

    recyclerView = view.findViewById(R.id.recycler_view);
    recyclerView.setHasFixedSize(true);
    recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));



    fuser = FirebaseAuth.getInstance().getCurrentUser();

    usersList = new ArrayList<>();

    reference = FirebaseDatabase.getInstance().getReference("Chatlist").child(fuser.getUid());
    reference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            usersList.clear();
            if(dataSnapshot.exists()) {
                for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                    Chatlist chatlist = snapshot.getValue(Chatlist.class);
                    usersList.add(chatlist);
                }
            }

            //chatList();
        }

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

        }
    });


    Chatlist chatlist=new Chatlist();

    DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
    DatabaseReference UserRef = rootRef.child("Users").child(chatlist.getId());
    UserRef.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

            for (DataSnapshot snapshot: dataSnapshot.getChildren()) {

                User user = snapshot.getValue(User.class);

                mUsers.add(user);

            }

            userAdapter = new UserAdapter(getContext(), mUsers, true);
            recyclerView.setAdapter(userAdapter);

        }

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

        }
    });



    return view;
}

Обновлять

Chatlist.java

    public class Chatlist {
    public String id;
    public String MessageCheck;

    public Chatlist() {
    }

    public Chatlist(String id) {
        this.id = id;

    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }


}

User.java

    public class User {

    private String id;
    private String First;
    private String EmailID;
    private String imageURL;
    private String status;

    public User(String id, String first, String emailID, String imageURL,String status) {
        this.id = id;
        this.First = first;
        this.EmailID = emailID;
        this.imageURL = imageURL;
        this.status=status;


    }

    public User() {
    }

    public User(String userid, String first_name, String eMail) {

    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getFirst() {
        return First;
    }

    public void setFirst(String first) {
        First = first;
    }

    public String getImageURL() {
        return imageURL;
    }

    public void setImageURL(String imageURL) {
        this.imageURL = imageURL;
    }

    public String getEmailID() {
        return EmailID;
    }

    public void setEmailID(String emailID) {
        EmailID = emailID;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

}

person Ravi Malik    schedule 17.04.2020    source источник


Ответы (1)


начните слушать узел users из вашего первого запроса узла chatlist:

reference = FirebaseDatabase.getInstance().getReference("Chatlist").child(fuser.getUid());

reference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
usersList.clear();
if(dataSnapshot.exists()) {
for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
Chatlist chatlist = snapshot.getValue(Chatlist.class);
usersList.add(chatlist);

//start listening to users node here
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference UserRef = rootRef.child("Users").child(chatlist.getId());
UserRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
.....
....
....
}
....
....

обновить

Убедитесь, что эта строка удалена:

Chatlist chatlist=new Chatlist();

обновление 2

не делайте этого внутри пользовательского запроса:

for (DataSnapshot snapshot: dataSnapshot.getChildren()) {

User user = snapshot.getValue(User.class);

mUsers.add(user);

}

вместо этого сделайте следующее:

User user = dataSnapshot.getValue(User.class);
mUsers.add(user);

обновление 3

класс чат-листа:

public class Chatlist {
public String id;


public Chatlist(String id) {
this.id = id;
}

public Chatlist(String id) {
    this.id = id;

}

public String getId() {
    return id;
}

public void setId(String id) {
    this.id = id;
}


}

класс пользователей:

public class User {

private String id;
private String First;
private String EmailId;
private String imageURL;
private String status;

public User(String id, String First, String EmailId, String imageURL,String status) {
    this.id = id;
    this.First = First;
    this.EmailId = EmailId;
    this.imageURL = imageURL;
    this.status=status;


}

public User() {
}

public User(String userid, String first_name, String eMail) {

}

public String getId() {
    return id;
}

public void setId(String id) {
    this.id = id;
}

public String getFirst() {
    return First;
}

public void setFirst(String first) {
    this.First = first;
}

public String getImageURL() {
    return imageURL;
}

public void setImageURL(String imageURL) {
    this.imageURL = imageURL;
}

public String getEmailID() {
    return EmailId;
}

public void setEmailID(String emailID) {
    this.EmailId = emailID;
}

public String getStatus() {
    return status;
}

public void setStatus(String status) {
    this.status = status;
}

}

person Hasan Bou Taam    schedule 17.04.2020
comment
вам нужно добавить UserRef.addListenerFor...... в метод onDataChange () запроса списка чатов. - person Hasan Bou Taam; 17.04.2020
comment
Теперь я получаю сообщение об ошибке в следующей строке User user = snapshot.getValue (User.class); и ошибка com.google.firebase.database.DatabaseException: невозможно преобразовать объект типа java.lang.String в тип com.shivam.chatapp2.Model.User - person Ravi Malik; 17.04.2020
comment
Я сделал это, если я тоже должен загрузить свой модальный класс ?? - person Ravi Malik; 17.04.2020
comment
Я реализовал ваше второе обновление, и теперь это следующая строка mUsers.add (user); и ошибка java.lang.NullPointerException: попытка вызвать метод интерфейса 'boolean java.util.List.add (java.lang.Object)' для ссылки на нулевой объект в com.shivam.chatapp2.Fragments.Chats $ 1 $ 1. onDataChange (Chats.java:105) - person Ravi Malik; 17.04.2020
comment
Добавлены оба класса модели. - person Ravi Malik; 17.04.2020
comment
Хорошо, посмотрите, переделайте эти классы и убедитесь, что имена переменных точно такие же, как имена ключей в базе данных (заглавные и строчные буквы должны оставаться одинаковыми как в классах, так и в базе данных). - person Hasan Bou Taam; 17.04.2020
comment
На самом деле он работал нормально, пока я не создал отдельную вкладку для списка чатов. Я мог видеть всех пользователей внутри узла пользователей без каких-либо ошибок в отдельной вкладке. Теперь я использую тот же адаптер, чтобы видеть всех пользователей и пользователей внутри списка чатов. я создаю отдельный адаптер для отображения элементов списка чатов ?? - person Ravi Malik; 17.04.2020
comment
вы сделали переменные объектов такими же, как и ваша база данных? - person Hasan Bou Taam; 17.04.2020
comment
Я сделал переменные объектов такими же, как в моей базе данных - person Ravi Malik; 17.04.2020
comment
До этого я использовал другой метод для отображения элементов списка чатов, и он работал нормально, но для этого мне пришлось загрузить всех детей внутри пользователей. Я тоже могу загрузить этот метод, если хотите. - person Ravi Malik; 17.04.2020
comment
используйте классы, которые я написал для вас в моем третьем обновлении. - person Hasan Bou Taam; 17.04.2020
comment
Ошибка остается такой же после использования ваших классов - person Ravi Malik; 17.04.2020
comment
ааа, убедитесь, что вы назвали класс «Пользователи», а не «Пользователь». - person Hasan Bou Taam; 17.04.2020
comment
Я изменил здесь User user = snapshot.getValue (User.class); mUsers.add (пользователь); и теперь ошибка изменилась на это исключение java.lang.NullPointerException: попытка вызвать метод интерфейса 'boolean java.util.List.add (java.lang.Object)' для ссылки на нулевой объект в com.shivam.chatapp2.Fragments.Chats $ 1 $ 1.onDataChange (Chats.java:112) - person Ravi Malik; 17.04.2020
comment
Я придумал решение в своем обновлении 2, но это только половина решения для этого не должно быть исправлено. пользователей под идентификатором пользователя текущего пользователя в списке чатов - person Ravi Malik; 17.04.2020