Home > Enterprise >  com.google.firebase.database.DatabaseException: Can't convert object of type java.lang.Long to
com.google.firebase.database.DatabaseException: Can't convert object of type java.lang.Long to

Time:01-06

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/3GJBWzyjbVfAJQkhMIFzrr2KG2L2?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/7JyFKNV0k6e4cwM8zNOb1coANfg1?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/AYha5pt6tGgzPa0e4WJLr8wSakk2?alt=media&token=63ff351c-f2d0-485f-9dfa-e396e94ebbc7",
  "uid" : "AYha5pt6tGgzPa0e4WJLr8wSakk2"
}

} }

CodePudding user response:

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.

  •  Tags:  
  • Related