【问题标题】:How to edit the data inside the unique id of a child in firebase database?如何在firebase数据库中编辑孩子的唯一ID内的数据?
【发布时间】:2018-12-23 23:06:25
【问题描述】:

尝试在我的应用中实现已读回执功能...

发布数据

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

【问题讨论】:

  • 能否请您添加您的数据库的图像?
  • 请看我编辑的问题
  • 好吧,从我从您的数据库图片中可以看出,seenRef.setValue(True); 创建了另一条路径。更新 seen 属性时访问的消息路径与在数据库中推送消息时访问的路径不同

标签: java android firebase firebase-realtime-database


【解决方案1】:

你正在尝试使用的这个方法

 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,我刚刚检查了您的数据库,我认为还缺少一个 ref

所以只要改变你的参考

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());
  }
});

【讨论】:

  • 没错...我如何访问它...'your_push_id_message'等于...我的意思是我需要声明它,但我不知道它是独一无二的并且是自动生成的。 . 那我该怎么做
  • 您需要创建一个值事件监听器并使用 getKey() 来获取每个帖子的键,请查看此stackoverflow.com/questions/37094631/…
  • 你还需要在这个监听器中创建你的 updateChildren 或 setValue
【解决方案2】:

您做错了,因为您是直接更新的值,而不是您使用 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");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-03
    • 2020-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-22
    • 1970-01-01
    相关资源
    最近更新 更多