0

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"
    }
  }
}
4

1 回答 1

0

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

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"依次。

然后你尝试从snapshot1with读取数据snapshot1.getValue(MessageClass.class)。这不起作用,因为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使用snapshot.getValue(MessageClass.class).

于 2021-09-25T15:17:08.873 回答