Java 如何在firebase数据库中编辑子项的唯一id内的数据?
正在尝试在我的应用程序中实现读取回执功能 过帐数据Java 如何在firebase数据库中编辑子项的唯一id内的数据?,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,正在尝试在我的应用程序中实现读取回执功能 过帐数据 private void sendMessage() { String messageText = messageArea.getText().toString(); if (TextUtils.isEmpty(messageText)) { Toast.makeText(getApplicationContext(), "Can't Send Blank Message", Toast.LENGTH_SHORT
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("");
}
});
}
}
我尝试了上述方法,但它只是在它旁边创建了一个hild,并将其值设置为true。。。。有人请帮帮我。。。提前谢谢
数据库-您尝试使用的此方法
DatabaseReference seenRef = mDatabaseReference.child("Messages").child(MessageSenderId).child(MessageRecieverId).child("Seen");
seenRef.setValue("True");
如果要替换或覆盖该引用处的当前值,我建议制作一个映射并使用updateChildren只更新所需引用处的值,如果需要在同一引用处更新多个值,这将为您节省多个setValues()
请检查您的seenRef,我刚刚检查了您的数据库,我想缺少一个参考
所以只要换个裁判就行了
DatabaseReference seenRef = mDatabaseReference.child("Messages").child(MessageSenderId).child(MessageRecieverId).child(your_push_id_message).child("Seen");
为了获取您的推送id消息,您需要获取消息的推送id来实现这一点,首先将一个侦听器连接到它并获取key()
您这样做是错误的,因为您是直接更新值,而不是使用push()为消息生成的消息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");
你能添加你数据库的图片吗?请看我编辑的问题,从你数据库的图片中我可以看到,
seenRef.setValue(True)代码>创建另一条路径。更新seen
属性时,您访问的消息路径与在数据库中推送消息时访问的路径不同,这是正确的。。。我如何访问那个。。。“您的推送id消息”将等于什么。。。我的意思是我需要声明它,但我不知道,因为它是唯一的和自动生成的。。那么我该怎么做呢?您需要创建一个值事件监听器,并使用getKey()来获取每个帖子的键,请选中此项。您还需要在该监听器中创建updateChildren或setValue
DatabaseReference seenRef = mDatabaseReference.child("Messages").child(MessageSenderId).child(MessageRecieverId).child(your_push_id_message).child("Seen");
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());
}
});
DatabaseReference seenRef = mDatabaseReference.child("Messages").child(MessageSenderId).child(MessageRecieverId).child("Seen");
seenRef.setValue("True");
DatabaseReference seenRef = mDatabaseReference.child("Messages").child(MessageSenderId).child(MessageRecieverId).child(Message-Id).child("Seen");
seenRef.setValue("True");