Android - Firebase - 无法将类型java.util.HashMap的值转换为String [英] Android - Firebase - Failed to convert value of type java.util.HashMap to String

查看:710
本文介绍了Android - Firebase - 无法将类型java.util.HashMap的值转换为String的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



保存群聊节点中的数据

当前数据库树





在组聊天节点中,用户的消息将被发送并存储在用户选择的群聊中。

如数据库树中所示,用户发送了一条消息,指出Hello,他的名字从用户节点$ b $中检索b

所需的数据库树



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


- -User ID --- 从用户节点中被撤销



问题

允许用户发送信息仅工作一次的功能,用于 FIRST 时间。以下是部署应用程序的时间,当用户登录时它崩溃。


$ b 错误 - Logcat


com.google.firebase.database.DatabaseException:未能将
类型的java.util.HashMap值转换为字符串

ChatActivity类 - 发送聊天消息功能

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

jGroupChatName = getIntent()。getExtras()。get(groupChatName)。toString();
jUserName = getIntent()。getExtras()。get(groupUserName)。toString();
jUserNeighbourhood = getIntent()。getExtras()。get(groupUserHome)。toString();

jChatToolbar =(工具栏)findViewById(R.id.allUSersToolBar);

jFirebaseCurrentUser = FirebaseAuth.getInstance()。getCurrentUser();

/ * UserID开始 - 我试图检索当前的用户ID,并将其添加到群聊节点
下选定的群聊* /
断言jFirebaseCurrentUser!=空值;
final String currentUserID = jFirebaseCurrentUser.getUid();
jChatRoot = FirebaseDatabase.getInstance()。getReference()。child(Group Chats)。child(jGroupChatName).child(currentUserID);
/ * UserID End * /

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

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

Map< String,Object> ; groupMap = new HashMap< String,Object>();
jGroupKey = jChatRoot.push().getKey();
jChatRoot.updateChildren(groupMap);

//基于上面的UserID代码,添加currentUserID,如下所示
//我的意图是将UserID保存在Group Chat名称下
// jGroupKey =(Name选择群聊)

DatabaseReference groupMessageRoot = jChatRoot.child(jGroupKey).child(currentUserID);
Map< String,Object> groupMap2 = new HashMap< String,Object>();
groupMap2.put(name,jUserName);
groupMap2.put(msg,jChatMessageText.getText()。toString()) ;

groupMessageRoot.updateChildren(groupMap2);
}
});

链接问题

Android - Firebase - 将用户发送到聊天室

未来的实施

未来,我打算允许用户通过编写代码来发送图片和录像,以允许用户访问他们的手机相机或图库,并将图片和vids数据发送到群组聊天节点中,在所选的群组名称下。我也想在发送后检索数据,但当然,如果我无法解决这些问题,我将在以后的问题中留下这些问题。 解决方案

你想要的数据库的分支是不必要的。您正在使用用户的UID创建不必要的级别。相反,合并这个层,即结合uid,消息和名称。您可以使用 someRef.orderByKey(uid)。equalTo(< user_uid>)来防止在该路径中需要特定的用户记录,例如聊天消息。
$ b

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

  public class ChatMessage {

private String uid;
私人字符串名称;
私人字符串消息;
私人的长时间创作时间;
$ b $ public ChatMessage(){
//调用DataSnapshot.getValue(ChatMessage.class)所需的默认构造函数
}
$ b $ public ChatMessage(String uid,String name,String message){
this.uid = uid;
this.name = name;
this.message = message;
}

public String getUid(){
return uid;

$ b $ 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(){
返回ServerValue.TIMESTAMP;
}

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

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


然后更新您的代码,如下所示:



$ $ $ $ $ $ $ $ $ $ $ $ $保护无效的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 =(工具栏)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); $!
$ b if(!TextUtils.isEmpty(userMessage)){
String newChatMessageKey = chatGroupRef.push()。getKey();
ChatMessage newChatMessage = new ChatMessage(userKey,user.getName(),userMessage);
chatGroupRef.child(newChatMessageKey).setValue(newChatMessage);
}
}


Aim

Save data within the Group Chat node

Current Database Tree

Within the Group Chats node, the user's messages will be sent and stored within the user's selected group chat.

As shown in the database tree, the user has sent a message saying "Hello" and his "name" is retrieved from the Users node

Desired Database Tree

The ---Msg ID--- is automatically generated

The ---User ID--- is retreived from the Users node

Problem

The function to allow the user to send message Only Worked Once which was for the FIRST time. The following times that the app was deployed, it crashed when the user logged in.

Error - Logcat

com.google.firebase.database.DatabaseException: Failed to convert value of type java.util.HashMap to String

ChatActivity Class - Send Chat Message function

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

        jGroupChatName = getIntent().getExtras().get("groupChatName").toString();
        jUserName = getIntent().getExtras().get("groupUserName").toString();
        jUserNeighbourhood = getIntent().getExtras().get("groupUserHome").toString();

        jChatToolbar = (Toolbar) findViewById(R.id.allUSersToolBar);

        jFirebaseCurrentUser = FirebaseAuth.getInstance().getCurrentUser();

        /*UserID Start - I was trying to retrieve the current user ID and add it to the Group Chat node, 
          under the selected Group Chat */
        assert jFirebaseCurrentUser != null;
        final String currentUserID = jFirebaseCurrentUser.getUid();
        jChatRoot = FirebaseDatabase.getInstance().getReference().child("Group Chats").child(jGroupChatName).child(currentUserID);
        /*UserID End*/

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

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

                Map<String, Object> groupMap = new HashMap<String, Object>();
                jGroupKey = jChatRoot.push().getKey();
                jChatRoot.updateChildren(groupMap);

                // Based on the UserID code at the top, the "currentUserID" is added as shown below
                // My intentions are to have the UserID saved under the name of the Group Chat
                // jGroupKey = (Name of selected Group Chat)

                DatabaseReference groupMessageRoot = jChatRoot.child(jGroupKey).child(currentUserID);
                Map<String, Object> groupMap2 = new HashMap<String, Object>();
                groupMap2.put("name", jUserName);
                groupMap2.put("msg", jChatMessageText.getText().toString());

                groupMessageRoot.updateChildren(groupMap2);
            }
        });
    }

Linked Question

Android - Firebase - Send Users to Chat Room

Future Implementations

In the future, I intend to allow the user to send pictures and video recordings by writing a code to allow the user to access their phone camera or gallery and send the pics and vids data into the Group Chats node, under the selected Group name. I would also like to retrieve data after sending, but of course, I will leave those in future questions if I am unable to solve them.

解决方案

Branching of your desired database is unnecessary. You are creating an unnecessary level using UID of users. Instead, merge this layer down, i.e. combine uid, message and name. You can then use someRef.orderByKey("uid").equalTo("<user_uid>") in case you need specific user's records within that path, for example chat messages.

So, create a class called 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;
    }
}

Then update your code as follows:

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

这篇关于Android - Firebase - 无法将类型java.util.HashMap的值转换为String的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆