Android 在同一firebase数据库的另一个子项的值事件侦听器中,使用值事件侦听器查找子项值

Android 在同一firebase数据库的另一个子项的值事件侦听器中,使用值事件侦听器查找子项值,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,我在firebase中有以下数据库 我得到了一个空指针引用,但我不确定我的方法是否正确。 以下是我想做的: 我从子“Messages”的快照中获取消息,获取接收方和发送方ID,使用这些ID并搜索子“Users”的快照。 然后,我想将另一个接收方用户(如果该用户向他发送了消息)或该用户(如果某个其他用户向该用户发送了消息)存储在自定义类型为“UserData”的arraylist中。在这两者之间,我还要检查数组列表中是否有重复的值。稍后,我将在适配器中使用该数组列表。这是密码 public Ar

我在firebase中有以下数据库

我得到了一个空指针引用,但我不确定我的方法是否正确。 以下是我想做的:

我从子“Messages”的快照中获取消息,获取接收方和发送方ID,使用这些ID并搜索子“Users”的快照。 然后,我想将另一个接收方用户(如果该用户向他发送了消息)或该用户(如果某个其他用户向该用户发送了消息)存储在自定义类型为“UserData”的arraylist中。在这两者之间,我还要检查数组列表中是否有重复的值。稍后,我将在适配器中使用该数组列表。这是密码

public ArrayList<UserData> makeChatDialogListForAdapter() {

    chatDialogList = new ArrayList<>();
    DatabaseReference messagesDatabase = FirebaseDatabase.getInstance().getReference("Messages");
    messagesDatabase.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            if(dataSnapshot !=null) {
                String currentUserId = grabUserIdFromUserDetails(currentUser.getDisplayName(), currentUser.getEmail());
                final Message generalMessage = dataSnapshot.getValue(Message.class);
                if (generalMessage.getReceiverUserId().equals(currentUserId))   //someone sent a message to current user
                {
                    DatabaseReference userDatabase = FirebaseDatabase.getInstance().getReference("Users");
                    userDatabase.addValueEventListener(new ValueEventListener() {
                        @Override
                        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                            UserData chatUser = dataSnapshot.child(generalMessage.getSenderUserId()).getValue(UserData.class);
                            if (!chatDialogList.contains(chatUser))
                                chatDialogList.add(chatUser);
                        }

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

                        }
                    });

                } else if (generalMessage.getSenderUserId().equals(currentUserId))  //current user sent message to someone
                {
                    DatabaseReference userDatabase = FirebaseDatabase.getInstance().getReference("Users");
                    userDatabase.addValueEventListener(new ValueEventListener() {
                        @Override
                        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                            UserData chatUser = dataSnapshot.child(generalMessage.getReceiverUserId()).getValue(UserData.class);
                            if (!chatDialogList.contains(chatUser))
                                chatDialogList.add(chatUser);
                        }


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

                        }
                    });

                }
            }


        }

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

        }
    });

    return chatDialogList;
}
publicArrayList makeChatDialogListForAdapter(){
chatDialogList=新建ArrayList();
DatabaseReference messagesDatabase=FirebaseDatabase.getInstance().getReference(“消息”);
messagesDatabase.addListenerForSingleValueEvent(新的ValueEventListener()){
@凌驾
public void onDataChange(@NonNull DataSnapshot DataSnapshot){
if(dataSnapshot!=null){
字符串currentUserId=grabUserIdFromUserDetails(currentUser.getDisplayName(),currentUser.getEmail());
最终消息generalMessage=dataSnapshot.getValue(Message.class);
if(generalMessage.getReceiverUserId().equals(currentUserId))//有人向当前用户发送了一条消息
{
DatabaseReference userDatabase=FirebaseDatabase.getInstance().getReference(“用户”);
userDatabase.addValueEventListener(新的ValueEventListener(){
@凌驾
public void onDataChange(@NonNull DataSnapshot DataSnapshot){
UserData chatUser=dataSnapshot.child(generalMessage.getSenderUserId()).getValue(UserData.class);
如果(!chatDialogList.contains(chatUser))
chatDialogList.add(chatUser);
}
@凌驾
已取消的公共void(@NonNull DatabaseError DatabaseError){
}
});
}else if(generalMessage.getSenderUserId().equals(currentUserId))//当前用户向某人发送了消息
{
DatabaseReference userDatabase=FirebaseDatabase.getInstance().getReference(“用户”);
userDatabase.addValueEventListener(新的ValueEventListener(){
@凌驾
public void onDataChange(@NonNull DataSnapshot DataSnapshot){
UserData chatUser=dataSnapshot.child(generalMessage.getReceiveUserId()).getValue(UserData.class);
如果(!chatDialogList.contains(chatUser))
chatDialogList.add(chatUser);
}
@凌驾
已取消的公共void(@NonNull DatabaseError DatabaseError){
}
});
}
}
}
@凌驾
已取消的公共void(@NonNull DatabaseError DatabaseError){
}
});
返回聊天列表;
}
以下是错误:

java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“boolean java.lang.String.equals(java.lang.Object)”


非常感谢您的帮助。

您正在将
ValueEventListener
附加到
/Messages
。由于下面有多条消息,因此传递到
onDataChange
DataSnapshot
将包含多个子节点。您的处理程序不会处理它接收多条消息的事实:

messagesDatabase.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        for (DataSnapshot messageSnapshot: dataSnapshot.getChildren()) {
            Sytem.out.println(messageSnapshot.getKey());  // 01, 02, etc
            Sytem.out.println(messageSnapshot.child("messageText").getValue(String.class));  // "Hello, how are you?", etc
        }
    }
    ...

不需要此检查:
if(dataSnapshot!=null){
DataSnapshot
将永远不会为空。即使该位置没有数据,
DataSnapshot
也将是一个有效对象。若要检查该位置是否存在任何数据,请使用。谢谢,但我将其放在那里,因为我尝试了任何希望修复它的方法。即使删除它,情况也一样。是否需要更多帮助求你了?我知道这不会有什么坏处,这就是为什么我把它作为一条评论。但是请在以后发布复制问题的最小代码。任何额外的东西都只是一种干扰。我以后会记住这一点。另外,假设我想使用参数displayName和email从同一数据库中的/Users获取用户名(我正在使用firebase auth获取它们)。我正在使用此函数()但是我得到了一个空id。你能看一下吗?我想一天前它还可以。让我们一次只回答一个问题。如果在这个问题解决后你有另一个问题,用它自己的问题发布一个新问题。这个特殊的问题可以解决,谢谢。但我特别需要的是没有。仍然有空指针错误当我在onDataChange.中创建新的Message.class对象时,我似乎找不到原因。