在同一Firebase数据库的另一个子项的值事件侦听器内使用值事件侦听器查找子值

时间:2018-07-09 17:51:17

标签: android firebase firebase-realtime-database

我在firebase中有以下数据库。

Database model image

我正在获取一个空指针引用,但我不确定我是否以正确的方式进行操作。 这是我想要做的:

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

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;
}

这是错误:

  

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

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

您正在将ListA = ['John', 'Glucose', 'ABC', 'XYZ'....] ListB = ['XYZ', 'John', 'Mike',.....] num = [] for i in range(len(ListB)): for a in range(len(ListA)): if ListB[i] == ListA[a]: print(a) num.append(a) num = sorted(num) print(ListA[POINT OF DIFFERENCE UPON OBSERVATION]) 附加到ValueEventListener。由于下面有多个消息,因此传递到/Messages的{​​{1}}将包含多个子节点。您的处理程序无法处理它收到多条消息的事实:

DataSnapshot
相关问题