如何在Firebase数据库中的孩子的唯一ID中编辑数据?

时间:2018-07-16 11:50:15

标签: 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).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。...有人请帮帮我...

数据库-https://ibb.co/js3iDd

2 个答案:

答案 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,我刚刚检查了您的数据库,但我想缺少一个参考

enter image description here

所以只需更改您的裁判

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");