目标
在群聊节点中保存数据
当前数据库树
在“群聊”节点中,将发送用户的消息并将其存储在用户选择的群聊中。
如数据库树中所示,用户已发送一条消息,说“ Hello”,并且从“用户”节点中检索了他的名字。
所需的数据库树
所述--- MSG ID ---自动生成
所述---用户ID ---从用户节点retreived
问题
该功能允许用户发送消息,只有一次得手这是第一次。在部署应用程序的以下时间中,用户登录后崩溃。
错误-Logcat
com.google.firebase.database.DatabaseException:无法将类型java.util.HashMap的值转换为String
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 = (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);
}
});
}
关联问题
未来的实施
将来,我打算允许用户通过编写代码来发送图片和视频记录,以允许用户访问其电话摄像头或画廊并将图片和vids数据发送到选定的“群组”名称下的“群组聊天”节点中。我也想在发送后检索数据,但是,如果无法解决这些问题,我当然会将它们留在以后。
不需要分支所需的数据库。您正在使用用户的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);
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句