首页 > 解决方案 > DataSnapshot 无法创建自定义对象

问题描述

我的问题是我试图让 messageAdapter 在 MessageActvity 的 recycleView 上显示数据库中的消息,这是执行此操作的方法代码(简而言之):

情况1

private void readMessages(final String myID, final String userID, final String imageURL) {
    mChat = new ArrayList<>();

    reference = FirebaseDatabase.getInstance().getReference("Chats");
    reference.addValueEventListener(new ValueEventListener() {

        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            mChat.clear();
            for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                Chat chat = snapshot.getValue(Chat.class);

                assert chat != null;
                if ( chat.getSender().equals(myID) &&  chat.getReceiver().equals(userID) ||
                     chat.getSender().equals(userID) &&  chat.getReceiver().equals(myID)) {
                    mChat.add(chat) ;
                }

                messageAdapter = new MessageAdapter(MessageActivity.this, mChat, imageURL);
                recyclerView.setAdapter(messageAdapter);
            }
        }
        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
        }

    });
}

错误:

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

问题是当手动定义聊天聊天时,该方法运行良好:

案例2

Chat chat = new Chat(sender, receiver, "hi there");

它甚至显示消息“你好”X 次(X = 数据库中的消息数)。

我什至尝试做类似的事情来使用快照:

案例3

 String sender = snapshot.child("sender").getValue()).toString();
 String receiver = snapshot.child("receiver").getValue()).toString();
 String message = snapshot.child("message").getValue()).toString();
            Chat chat = new Chat(sender,receiver,message);

但是,它仍然不起作用。结果总是崩溃(除了手动定义的 case- 2,它可以工作)。

我尝试将 if 语句的条件更改为:

案例4

if (chat.getSender() != null && chat.getReceiver() != null && chat.getSender().equals(myID) &&  chat.getReceiver().equals(userID) ||
    chat.getSender() != null && chat.getReceiver() != null && chat.getSender().equals(userID) &&  chat.getReceiver().equals(myID)) {
                    mChat.add(chat) ;
    }

并且在这样做之后,应用程序不再崩溃,因为 if 语句不起作用......我认为让应用程序崩溃的是

chat.getSender() == null && chat.getReceiver == null

当 if 语句开始检查它的条件时,它就会崩溃。

编辑更新:在尝试了 log.v 之后,结果发现从 datasnapshot 和 getter 方法返回的值是 null!。这是代码

if (chat.getSender() == null){
         Log.v("MessageActivity", "sender is null: " + chat.getSender());
}
if (chat.getReceiver() == null) {
         Log.v("MessageActivity", "receiver is null: " + chat.getReceiver());
}

更新

Log.v("MessageActivity", "snapshot: " +snapshot );
Log.v("MessageActivity", "chat variables: " + chat.getMessage() + ", " + chat.getReceiver() + ", " + chat.getSender() );
Log.v("MessageActivity", "mchat: " + mChat);

控制台:

2020-06-10 21:17:44.578 29735-29735/com.example.android.chattingapp V/MessageActivity: sender is null: null
2020-06-10 21:17:44.578 29735-29735/com.example.android.chattingapp V/MessageActivity: receiver is null: null

//updated
snapshot: DataSnapshot { key = -M9TzQuBbYfv-OhJgRyR, value = {message: =hahah, sender: =DuD8LfwlreNjByrptsh4zgXDQie2, receiver: =hFpPOfnvsKbJiZtfCBoGyDPnQXy2} }
chat variables: null, null, null
mchat: []

并且在尝试调试代码时,快照似乎具有如图所示的数据调试屏幕

编辑 2:我包含了 firebase 数据库数据的图像数据库数据

编辑 3:我的聊天课程

public class Chat{

private String sender;
private String receiver;
private String message;

public Chat(String message, String sender, String receiver) {
    this.sender = sender;
    this.receiver = receiver;
    this.message = message;
}

public Chat(){

}

public String getSender() {
    return sender;
}

public void setSender(String sender) {
    this.sender = sender;
}

public String getReceiver() {
    return receiver;
}

public void setReceiver(String receiver) {
    this.receiver = receiver;
}

public String getMessage() {
    return message;
}

public void setMessage(String message) {
    this.message = message;
}
}

标签: javaandroidfirebasefirebase-realtime-database

解决方案


首先,感谢所有试图提供帮助的人。

经过这么多时间和研究,我找到了解决问题的方法,结果证明 readMessage 方法从一开始就工作得很好:)

错误出现在发送消息方法中(顺便说一句,它工作得很好!)。

原来的代码是这样的:

private void sendMessage(String sender, String receiver, String message) {

    DatabaseReference reference = FirebaseDatabase.getInstance().getReference();

    HashMap<String, Object> hashMap = new HashMap<>();
    hashMap.put("sender: ", sender);
    hashMap.put("receiver: ", receiver);
    hashMap.put("message: ", message);

    reference.child("Chats").push().setValue(hashMap);
}

正确的代码是:

private void sendMessage(String sender, String receiver, String message) {
    DatabaseReference reference = FirebaseDatabase.getInstance().getReference();

    HashMap<String, Object> hashMap = new HashMap<>();
    hashMap.put("sender", sender);
    hashMap.put("receiver", receiver);
    hashMap.put("message", message);

    reference.child("Chats").push().setValue(hashMap);
}

如果您没有注意到差异,它在 hashMap.put (sender: )、(receiver: ) 和 (message: ) 中。


推荐阅读