无法将 java.lang.String 类型的对象转换为 com.example.myapplication.MessageClass 类型



com.google.firebase.database.DatabaseException:无法将java.lang.String类型的对象转换为com.example.myapplication.MessageClass 类型

MessageClass.class对此进行编码。

public class MessageClass {
String userId,messages,messageId;
long timestamp;
public MessageClass(String userId, String messages, long timestamp) {
this.userId = userId;
this.messages = messages;
this.timestamp = timestamp;
}
public MessageClass(String userId, String messages) {
this.userId = userId;
this.messages = messages;
}
public MessageClass(){
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getMessages() {
return messages;
}
public void setMessages(String messages) {
this.messages = messages;
}
public String getMessageId() {
return messageId;
}
public void setMessageId(String messageId) {
this.messageId = messageId;
}
public long getTimestamp() {
return timestamp;
}
public void setTimestamp(long timestamp) {
this.timestamp = timestamp;
}
}

聊天活动.java

public class ChatActivity extends AppCompatActivity {
CircleImageView imageView;
RecyclerView recyclerView;
ImageView backArrow,video,call,menus,send_btn,AttachFile,Emoji;
EditText EnterMessage;
TextView username;
FirebaseDatabase database;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_chat);
imageView=findViewById(R.id.chat_pro_pic);
recyclerView=findViewById(R.id.chatRecyclerView2);
backArrow=findViewById(R.id.back_arrow);
video=findViewById(R.id.video_call);
call=findViewById(R.id.call_btn);
menus=findViewById(R.id.menu_btn);
send_btn=findViewById(R.id.send_btn);
AttachFile=findViewById(R.id.files_btn);
Emoji=findViewById(R.id.emoji_bar);
EnterMessage=findViewById(R.id.type_msg);
username=findViewById(R.id.chat_username);
FirebaseAuth mAuth =FirebaseAuth.getInstance();

final String senderId= mAuth.getUid();
String receiveId = getIntent().getStringExtra("userId");
String name = getIntent().getStringExtra("name");
String profilePic= getIntent().getStringExtra("profilePic");
username.setText(name);
Picasso.get().load(profilePic).placeholder(R.drawable.profile).into(imageView);
backArrow.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent=new Intent(ChatActivity.this,MainActivity.class);
startActivity(intent);
}
});
final ArrayList<MessageClass> messageClasses =new ArrayList<>();
final chatAdapter chatAdapter=new chatAdapter(messageClasses,this,receiveId);
recyclerView.setAdapter(chatAdapter);
LinearLayoutManager layoutManager=new LinearLayoutManager(this);
recyclerView.setLayoutManager(layoutManager);
final String senderMe =senderId+receiveId;
final String receiveMe =receiveId+senderId;
database=FirebaseDatabase.getInstance();
database.getReference().child("chats").child(senderMe)
.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
messageClasses.clear();
for (DataSnapshot snapshot1 : snapshot.getChildren()){
MessageClass msg =snapshot1.getValue(MessageClass.class);
msg.setMessageId(snapshot1.getKey());
messageClasses.add(msg);
}
chatAdapter.notifyDataSetChanged();
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
send_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String message = EnterMessage.getText().toString();
final MessageClass classes= new MessageClass(senderId,message);
classes.setTimestamp(new Date().getTime());
EnterMessage.setText(message);
database.getReference().child("chats").child(senderMe)
.setValue(classes).addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
database.getReference().child("chats")
.child(receiveMe)
.push()
.setValue(classes).addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
}
});
}
});
}
});
}
}

在这段代码中,当我运行这个应用程序时,我不得不面对一些错误。我在edittext中输入了一些文本,这些文本保存到firebase实时数据库中,但没有显示在移动应用程序ChatActivity中,应用程序已经崩溃。

从firebase数据库导出JSON文件。

{
"Users" : {
"PWGD0vsRhfd83tqM1ClwvwqJIRD3" : {
"email" : "abc@gmail.com",
"name" : "Abc",
"password" : "123456"
}
},
"chats" : {
"PWGD0vsRhfd83tqM1ClwvwqJIRD3PWGD0vsRhfd83tqM1ClwvwqJIRD3" : {
"messages" : "hiii",
"timestamp" : 1632570537312,
"userId" : "PWGD0vsRhfd83tqM1ClwvwqJIRD3"
}
}
}

问题出现在您的代码片段中:

database.getReference().child("chats").child(senderMe)
.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
messageClasses.clear();
for (DataSnapshot snapshot1 : snapshot.getChildren()){
MessageClass msg =snapshot1.getValue(MessageClass.class);
msg.setMessageId(snapshot1.getKey());
messageClasses.add(msg);
}
chatAdapter.notifyDataSetChanged();
}

您将侦听器附加到/chats/$user,这意味着snapshot将包含以下数据:

"PWGD0vsRhfd83tqM1ClwvwqJIRD3PWGD0vsRhfd83tqM1ClwvwqJIRD3" : {
"messages" : "hiii",
"timestamp" : 1632570537312,
"userId" : "PWGD0vsRhfd83tqM1ClwvwqJIRD3"
}

然后在onDataChange中,在snapshot.getChildren上循环,因此snapshot1将依次为"messages": "hiii""timestamp" : 1632570537312"userId" : "PWGD0vsRhfd83tqM1ClwvwqJIRD3"

然后尝试使用snapshot1.getValue(MessageClass.class)snapshot1读取数据。这不会起作用,因为messages(以及其他属性)是而不是完整消息。


您的代码是在这样的数据结构上工作的:

"PWGD0vsRhfd83tqM1ClwvwqJIRD3PWGD0vsRhfd83tqM1ClwvwqJIRD3" : { // 👈 user ID
"-LMSDjlfsdfhkjsdf90318": { // 👈 message ID
"messages" : "hiii",
"timestamp" : 1632570537312,
"userId" : "PWGD0vsRhfd83tqM1ClwvwqJIRD3"
},
"-LMTsdfh23sad9023343": { // 👈 message ID
"messages" : "hello again",
"timestamp" : 1632570537342,
"userId" : "PWGD0vsRhfd83tqM1ClwvwqJIRD3"
},
}

但在当前的数据结构中,您缺少message ID级别。当您添加该级别时,它将起作用。

或者,您可以删除for (DataSnapshot snapshot1 : snapshot.getChildren()){循环,并使用snapshot.getValue(MessageClass.class)snapshot读取您当前拥有的单个消息。

最新更新