java - 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;
}
}
解决方案
首先,感谢所有试图提供帮助的人。
经过这么多时间和研究,我找到了解决问题的方法,结果证明 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: ) 中。
推荐阅读
- python-3.x - selenium 无法定位元素 - 我试过按名称查找、按类名查找、按 xpath 查找,但都返回无法定位元素
- html - 如何在 css3 中缩小一个元素同时放大另一个元素
- sql - 大文件导出到 postgreSQL
- python - 如何根据 Python/pandas 中的前缀从字符串中提取某些值?
- javascript - 笑话导入语句:'TypeError:无法设置属性'fillStyle'为空'
- python - 如何在子目录中搜索特定文件?
- c# - 为 REST Api C# 配置身份
- flutter - 显示更大的图标 [Flutter]
- python - 如何从 tkinter 中的不同类访问变量和函数?
- asynchronous - Rust:加入和迭代期货的结果