Android - Firebase - 无法将java.util.HashMap类型的值转换为String

时间:2017-09-28 14:22:03

标签: java android firebase exception firebase-realtime-database

目标

在群聊节点中保存数据

当前数据库树

enter image description here

在“群聊”节点中,用户的消息将被发送并存储在用户选定的群聊中。

如数据库树所示,用户发送了一条消息“Hello”,并从Users节点中检索了 name

所需的数据库树

enter image description here

自动生成 --- Msg ID ---

从用户节点

中检索 ---用户ID ---

问题

允许用户发送消息仅工作的功能,这是 FIRST 时间。以下时间部署了应用程序,当用户登录时崩溃。

错误 - Logcat

  

com.google.firebase.database.DatabaseException:无法转换   java.util.HashMap类型的值为String

ChatActivity类 - 发送聊天消息功能

with open("test.txt") as f:
    lines = f.readlines()

lines # ['This is the first line.\n', 'This is the second line.\n']

lines[0] = "This is the line that's replaced.\n"

lines # ["This is the line that's replaced.\n", 'This is the second line.\n']

with open("test.txt", "w") as f:
    f.writelines(lines)

关联问题

Android - Firebase - Send Users to Chat Room

未来实施

将来,我打算允许用户通过编写代码来发送图片和视频录像,以允许用户访问他们的手机摄像头或图库,并将图片和视频数据发送到所选的群组聊天节点下团队名字。我也希望在发送后检索数据,但当然,如果我无法解决这些问题,我会留下未来的问题。

1 个答案:

答案 0 :(得分:1)

不需要对所需数据库进行分支。您正在使用用户的UID创建不必要的级别。相反,将该层合并,即组合uid,消息和名称。然后,您可以使用someRef.orderByKey("uid").equalTo("<user_uid>"),以防您在该路径中需要特定用户的记录,例如聊天消息。

因此,创建一个名为ChatMessage的类:

public class ChatMessage {

    private String uid;
    private String name;
    private String message;
    private Long creationTime;

    public ChatMessage() {
        // Default constructor required for calls to DataSnapshot.getValue(ChatMessage.class)
    }

    public ChatMessage(String uid, String name, String message) {
        this.uid = uid;
        this.name = name;
        this.message = message;
    }

    public String getUid() {
        return uid;
    }

    public void setUid(String uid) {
        this.uid = uid;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public java.util.Map<String, String> getCreationTime() {
        return ServerValue.TIMESTAMP;
    }

    @Exclude
    public Long getCreationTimeLong() {
        return creationTime;
    }

    public void setCreationTime(Long creationTime) {
        this.creationTime = creationTime;
    }
}

然后按如下方式更新您的代码:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_chat);

    chatGroupName = getIntent().getStringExtra(CHAT_GROUP_NAME);
    userKey = getIntent().getStringExtra(USER_KEY);
    user = getIntent().getParcelableExtra(USER);

    jChatToolbar = (Toolbar) findViewById(R.id.allUSersToolBar);
    jChatMessageText = (EditText) findViewById(R.id.chatMessageText);
    jChatSendTextBtn = (ImageButton) findViewById(R.id.chatSendTextBtn);

    jChatSendTextBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            sendMessage();
        }
    });
}

private void sendMessage() {
    String userMessage = jChatMessageText.getText().toString();
    chatGroupRef = FirebaseDatabase.getInstance().getReference().child("Group Chats").child(chatGroupName);

    if (!TextUtils.isEmpty(userMessage)) {
        String newChatMessageKey = chatGroupRef.push().getKey();
        ChatMessage newChatMessage = new ChatMessage(userKey, user.getName(), userMessage);
        chatGroupRef.child(newChatMessageKey).setValue(newChatMessage);
    }
}