尝试在我的应用中实现已读回执功能...
发布数据
private void sendMessage() {
String messageText = messageArea.getText().toString();
if (TextUtils.isEmpty(messageText)) {
Toast.makeText(getApplicationContext(), "Can't Send Blank Message", Toast.LENGTH_SHORT).show();
} else {
String message_sender_ref = "Messages/" + MessageSenderId + "/" + MessageRecieverId;
String message_reciver_ref = "Messages/" + MessageRecieverId + "/" + MessageSenderId;
Map messageTextBody = new HashMap<>();
messageTextBody.put("Message", messageText);
messageTextBody.put("Seen", "False");
messageTextBody.put("Type", "Text");
messageTextBody.put("Time", ServerValue.TIMESTAMP);
messageTextBody.put("From", MessageSenderId);
DatabaseReference user_message_key = mDatabaseReference.child("Messages").child(MessageSenderId).child(MessageRecieverId).push();
String message_push_id = user_message_key.getKey();
Map messageBodyDetails = new HashMap();
messageBodyDetails.put(message_sender_ref + "/" + message_push_id, messageTextBody);
messageBodyDetails.put(message_reciver_ref + "/" + message_push_id, messageTextBody);
mDatabaseReference.updateChildren(messageBodyDetails, new DatabaseReference.CompletionListener() {
@Override
public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) {
if (databaseError != null) {
Log.d("Chat_Log", databaseError.getMessage().toString());
}
messageArea.setText("");
}
});
}
}
现在如何访问唯一ID内的“ Seen = False”数据...我可以通过ValueEventListener访问它,但是如何进行更改?我只知道要获取数据,但是我想更改它的数据...有人可以帮帮我吗
尝试过的方法
DatabaseReference seenRef = mDatabaseReference.child("Messages").child(MessageSenderId).child(MessageRecieverId).child("Seen");
seenRef.setValue("True");
我尝试了上述方法,但它只是在其旁边创建了一个hild并将其值设置为true。...有人请帮帮我...
答案 0 :(得分:0)
您尝试使用的这种方法
DatabaseReference seenRef = mDatabaseReference.child("Messages").child(MessageSenderId).child(MessageRecieverId).child("Seen");
seenRef.setValue("True");
正在替换或覆盖该参考处的当前值,我建议创建一个映射并使用updateChildren来更新所需参考处的值,如果您需要在同一参考处更新多个值,这将节省您多个setValues()
Map<String, Object> update = new HashMap<String,Object>();
update.put("Seen", true);
seenRef.updateChildren(update);
,但是您也可以执行与在setValue()
中不使用“”的情况相同的操作,因为您要在其中输入布尔布尔值true或false,并向数据库发送字符串“ True”,这将创建一个新的键,以替换/覆盖具有值Seen : true
DatabaseReference seenRef = mDatabaseReference.child("Messages").child(MessageSenderId).child(MessageRecieverId).child("Seen");
seenRef.setValue(true);
请检查您的seenRef,我刚刚检查了您的数据库,但我想缺少一个参考
所以只需更改您的裁判
DatabaseReference seenRef = mDatabaseReference.child("Messages").child(MessageSenderId).child(MessageRecieverId).child(your_push_id_message).child("Seen");
为了获取your_push_id_message,您需要获取消息的推送ID来做到这一点,首先将侦听器附加到该消息上,并获取getKey()
seenRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot snapshot : dataSnapshot.getChildren()){
String pushMessage = snapshot.getKey();
dataSnapshot.child(pushMessage).child("Seen").setValue(true);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
System.out.println("The read failed: " + databaseError.getCode());
}
});
答案 1 :(得分:0)
您做错了,因为您是直接更新的值,而不是使用push()为消息生成的message-id
您在这里
DatabaseReference seenRef = mDatabaseReference.child("Messages").child(MessageSenderId).child(MessageRecieverId).child("Seen");
seenRef.setValue("True");
但是您没有引用需要执行的消息ID。
像波纹管
DatabaseReference seenRef = mDatabaseReference.child("Messages").child(MessageSenderId).child(MessageRecieverId).child(Message-Id).child("Seen");
seenRef.setValue("True");