【问题标题】:com.google.firebase.database.DatabaseException: Can't convert object of type java.lang.Long to type com.example.whatsappback.Models.Messagecom.google.firebase.database.DatabaseException:无法将 java.lang.Long 类型的对象转换为 com.example.whatsappback.Models.Message 类型
【发布时间】:2022-01-05 10:28:38
【问题描述】:

我收到此错误,每次尝试发送消息时应用都会崩溃

com.google.firebase.database.DatabaseException:无法将 java.lang.Long 类型的对象转换为 com.example.whatsappback.Models.Message 类型

在 com.example.whatsappback.Activities.ChatActivity$1.onDataChange(ChatActivity.java:63)

这是:

Message message = snapshot1.getValue(Message.class);

这是我的聊天活动 在这里我得到了错误

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();
}}

这是模型类 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;
}

}

我的 JSON 文件,其中我的第一个是聊天数据库,第二个是登录应用程序的用户

{"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"
    },
  }
}

这是用户数据库

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

} }

【问题讨论】:

  • 请编辑您的问题并将您的数据库结构添加为 JSON 文件。您可以通过单击 Firebase Console 的溢出菜单 (⠇) 中的导出 JSON 来简单地获取它。
  • 先生,我正在这样做,但它说“看起来您的帖子主要是代码;请添加更多详细信息。”虽然我删除了不必要的代码
  • 然后尝试在该代码中添加一些解释。
  • 请先生检查
  • 请同时添加你的Message类的内容。

标签: java android firebase firebase-realtime-database


【解决方案1】:

问题出在你分享的 JSON 中的第二个房间:

"3GJBWzyjbVfAJQkhMIFzrr2KG2L27JyFKNV0k6e4cwM8zNOb1coANfg1" : {
  "messages" : {
    "-MsW6Lem6hq_hxZjeOQA" : {
      "feeling" : 0,
      "message" : "helloo",
      "senderId" : "7JyFKNV0k6e4cwM8zNOb1coANfg1",
      "timeStamp" : 1641233081867
    },
    "feeling" : 0,
    "message" : "hi",
    "senderId" : "7JyFKNV0k6e4cwM8zNOb1coANfg1",
    "timeStamp" : 1641231670227
  }
},

在这里,您首先有一条带有键 -MsW6Lem6hq_hxZjeOQA 的消息看起来不错,但随后您在 messages 节点下拥有另一条消息的属性,因此没有父键。

因此,在您的onDataChange 中,当您使用DataSnapshot snapshot1: snapshot.getChildren() 循环遍历结果时,您首先会获得-MsW6Lem6hq_hxZjeOQA 节点,这样就可以了。但是接下来snapshot1 变成"feeling" : 0,然后当你调用snapshot1.getValue(Message.class) 时会抛出错误。

解决方案是确保您的消息属性始终存储在一个按键下。我建议在security rules 中强制执行。

【讨论】:

  • 谢谢先生,它现在正在运行,我从火力库中删除了所有聊天,然后再次运行该应用程序,它正在运行
  • 是的,为什么不呢?先生
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-19
  • 1970-01-01
  • 2020-08-17
  • 2021-05-02
  • 2018-04-09
  • 2020-09-23
  • 1970-01-01
相关资源
最近更新 更多