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