Issue
I am getting this Error, App is crashing every time when I try to send messages
com.google.firebase.database.DatabaseException: Can't convert object of type java.lang.Long to type com.example.whatsappback.Models.Message
at com.example.whatsappback.Activities.ChatActivity$1.onDataChange(ChatActivity.java:63)
Which is:
Message message = snapshot1.getValue(Message.class);
This is My ChatActivity Here I am getting the Error
public class ChatActivity extends AppCompatActivity {
ActivityChatBinding binding;
MessagesAdapter adapter;
ArrayList<Message>messages;
FirebaseDatabase database;
String senderRoom, receiverRoom;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ActivityChatBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
messages = new ArrayList<>();
adapter = new MessagesAdapter(this, messages);
binding.recyclerView.setLayoutManager(new LinearLayoutManager(this));
binding.recyclerView.setAdapter(adapter);
String name = getIntent().getStringExtra("name");
String receiverUid = getIntent().getStringExtra("uid");
String senderUid = FirebaseAuth.getInstance().getUid();
senderRoom = senderUid+receiverUid;
receiverRoom = receiverUid+senderUid;
database = FirebaseDatabase.getInstance();
database.getReference().child("chats")
.child(senderRoom)
.child("messages")
.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
messages.clear();
for (DataSnapshot snapshot1: snapshot.getChildren())
{
Message message = snapshot1.getValue(Message.class);
messages.add(message);
}
adapter.notifyDataSetChanged();
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
binding.sendBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String messageTxt = binding.messageBox.getText().toString();
Date date = new Date();
Message message = new Message(messageTxt, senderUid, date.getTime());
binding.messageBox.setText("");
database.getReference().child("chats")
.child(senderRoom)
.child("messages")
.push()
.setValue(message).addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void unused) {
database.getReference().child("chats")
.child(receiverRoom)
.child("messages")
.push()
.setValue(message).addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void unused) {
}
});
}
});
}
});
}
@Override
public boolean onSupportNavigateUp() {
finish();
return super.onSupportNavigateUp();
}}
This is The Model Class Message.java
public class Message {
private String messageId, message, senderId;
private long timeStamp;
private int feeling;
public Message() {
}
public Message(String message, String senderId, long timeStamp) {
this.message = message;
this.senderId = senderId;
this.timeStamp = timeStamp;
}
public String getMessageId() {
return messageId;
}
public void setMessageId(String messageId) {
this.messageId = messageId;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public String getSenderId() {
return senderId;
}
public void setSenderId(String senderId) {
this.senderId = senderId;
}
public long getTimeStamp() {
return timeStamp;
}
public void setTimeStamp(long timeStamp) {
this.timeStamp = timeStamp;
}
public int getFeeling() {
return feeling;
}
public void setFeeling(int feeling) {
this.feeling = feeling;
}
}
My JSON FILE where I the first one is Chats Database and Second One is Users who login in the App
{"chats" : {
"3GJBWzyjbVfAJQkhMIFzrr2KG2L23GJBWzyjbVfAJQkhMIFzrr2KG2L2" : {
"messages" : {
"-MsW3CCOLw1CRDYWahl4" : {
"feeling" : 0,
"message" : "hi",
"senderId" : "3GJBWzyjbVfAJQkhMIFzrr2KG2L2",
"timeStamp" : 1641232243332
},
"-MsYWOVMOe17EMptWwlS" : {
"feeling" : 0,
"message" : "hhhhh",
"senderId" : "3GJBWzyjbVfAJQkhMIFzrr2KG2L2"
}}},
"3GJBWzyjbVfAJQkhMIFzrr2KG2L27JyFKNV0k6e4cwM8zNOb1coANfg1" : {
"messages" : {
"-MsW6Lem6hq_hxZjeOQA" : {
"feeling" : 0,
"message" : "helloo",
"senderId" : "7JyFKNV0k6e4cwM8zNOb1coANfg1",
"timeStamp" : 1641233081867
},
"feeling" : 0,
"message" : "hi",
"senderId" : "7JyFKNV0k6e4cwM8zNOb1coANfg1",
"timeStamp" : 1641231670227
}
},
"3GJBWzyjbVfAJQkhMIFzrr2KG2L2AYha5pt6tGgzPa0e4WJLr8wSakk2" : {
"messages" : {
"-MsYtwRyavktJc8hwonR" : {
"feeling" : 0,
"message" : "",
"senderId" : "3GJBWzyjbVfAJQkhMIFzrr2KG2L2"
},
"-MsYtwwvlBe0Ocdvlggu" : {
"feeling" : 0,
"message" : "",
"senderId" : "3GJBWzyjbVfAJQkhMIFzrr2KG2L2"
},
}
},
"7JyFKNV0k6e4cwM8zNOb1coANfg13GJBWzyjbVfAJQkhMIFzrr2KG2L2" : {
"messages" : {
"-MsW6L_AmpIryN0DBjyt" : {
"feeling" : 0,
"message" : "helloo",
"senderId" : "7JyFKNV0k6e4cwM8zNOb1coANfg1",
"timeStamp" : 1641233081867
},
"-MsW8eU0KN4Ge8bC1ktq" : {
"feeling" : 0,
"message" : "hi",
"senderId" : "7JyFKNV0k6e4cwM8zNOb1coANfg1",
"timeStamp" : 1641233687661
},
"feeling" : 0,
"message" : "hi",
"senderId" : "7JyFKNV0k6e4cwM8zNOb1coANfg1",
"timeStamp" : 1641231670227
}
},
"AYha5pt6tGgzPa0e4WJLr8wSakk23GJBWzyjbVfAJQkhMIFzrr2KG2L2" : {
"messages" : {
"-MsYtw_o0dnh8meRwdI9" : {
"feeling" : 0,
"message" : "",
"senderId" : "3GJBWzyjbVfAJQkhMIFzrr2KG2L2"
},
}
}
This one is Users DataBase
"users" : {
"3GJBWzyjbVfAJQkhMIFzrr2KG2L2" : {
"name" : "Om Swami",
"phoneNumber" : "+919887012345",
"profileImage" : "https://firebasestorage.googleapis.com/v0/b/whatsapp-back.appspot.com/o/Profiles%2F3GJBWzyjbVfAJQkhMIFzrr2KG2L2?alt=media&token=be73d814-99cf-4fb4-8d9c-78aa1144a8e7",
"uid" : "3GJBWzyjbVfAJQkhMIFzrr2KG2L2"
},
"7JyFKNV0k6e4cwM8zNOb1coANfg1" : {
"name" : "Prinshu❣️",
"phoneNumber" : "+9197864110",
"profileImage" : "https://firebasestorage.googleapis.com/v0/b/whatsapp-back.appspot.com/o/Profiles%2F7JyFKNV0k6e4cwM8zNOb1coANfg1?alt=media&token=2fb22085-3644-4703-b782-f3500dcce2b1",
"uid" : "7JyFKNV0k6e4cwM8zNOb1coANfg1"
},
"AYha5pt6tGgzPa0e4WJLr8wSakk2" : {
"name" : "Ishmita Om",
"phoneNumber" : "+91988782409",
"profileImage" : "https://firebasestorage.googleapis.com/v0/b/whatsapp-back.appspot.com/o/Profiles%2FAYha5pt6tGgzPa0e4WJLr8wSakk2?alt=media&token=63ff351c-f2d0-485f-9dfa-e396e94ebbc7",
"uid" : "AYha5pt6tGgzPa0e4WJLr8wSakk2"
}
} }
Solution
The problem is in the second room in the JSON you shared:
"3GJBWzyjbVfAJQkhMIFzrr2KG2L27JyFKNV0k6e4cwM8zNOb1coANfg1" : {
"messages" : {
"-MsW6Lem6hq_hxZjeOQA" : {
"feeling" : 0,
"message" : "helloo",
"senderId" : "7JyFKNV0k6e4cwM8zNOb1coANfg1",
"timeStamp" : 1641233081867
},
"feeling" : 0,
"message" : "hi",
"senderId" : "7JyFKNV0k6e4cwM8zNOb1coANfg1",
"timeStamp" : 1641231670227
}
},
Here you first have a message with key -MsW6Lem6hq_hxZjeOQA that looks fine, but then you have the properties of another message right under the messages node, so without a parent key.
So in your onDataChange when you loop over the results with DataSnapshot snapshot1: snapshot.getChildren(), you first get the -MsW6Lem6hq_hxZjeOQA node and that goes fine. But next snapshot1 becomes "feeling" : 0 and when you then call snapshot1.getValue(Message.class) that throws the error.
The solution is ensure your message properties are always stored under a push key. I recommend enforcing that in security rules.
Answered By - Frank van Puffelen
0 comments:
Post a Comment
Note: Only a member of this blog may post a comment.