Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在firebase数据库中编辑子项的唯一id内的数据?_Java_Android_Firebase_Firebase Realtime Database - Fatal编程技术网

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