如何从Firebase实时数据库中删除特定数量的节点

时间:2020-07-08 03:16:53

标签: android firebase firebase-realtime-database

我有一个应用,其结构类似于

休息室-------- 消息------ Chatroomid --------- -消息1 -Message2

在此聊天室中,当消息数达到200条时,我想删除前50条消息。因此,如果消息数为200条,则会将消息从message1删除到message50。我正在使用消息的按键。

我的用于发送消息的Java代码

send.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View v) {

              Map<String,Object> message = new HashMap<>();
              message.put("message",messageBox.getText().toString());
              message.put("imageurl",ppurl);
              message.put("sender",FirebaseAuth.getInstance().getCurrentUser().getUid());

              reference2.push().setValue(message).addOnSuccessListener(new OnSuccessListener<Void>() {
                  @Override
                  public void onSuccess(Void aVoid) {

                      messageBox.setText("");

                  }
              }).addOnFailureListener(new OnFailureListener() {
                  @Override
                  public void onFailure(@NonNull Exception e) {

                      Toast.makeText(chatroom.this, "Error" + e.getMessage(), Toast.LENGTH_SHORT).show();

                  }
              });

          }
      });

我的Java代码以获取消息


    private void getdata() {
        ref.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                if (snapshot.exists()) {
                    for (DataSnapshot npsnapshot : snapshot.getChildren()) {

                        message l = npsnapshot.getValue(message.class);
                        list.add(l);
                    }

                    messageAdapter.notifyDataSetChanged();
                }else {


                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {

            }
        });


    }

1 个答案:

答案 0 :(得分:0)

您可以轻松地将其添加到现有的getdata函数中:

ref.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot snapshot) {
        if (snapshot.exists()) {
            if (snapshot.getChildrenCount() > 200) {
                int count = 0;
                Map<String, Object> updates = new HashMap<>();
                for (DataSnapshot npsnapshot : snapshot.getChildren()) {
                    if (count++ <= 50) {
                        updates.put(npsnapshot.getKey(), null);
                    }
                }
                ref.updateChildren(updates); // this will refire onDataChange, so we'll update the UI then                
            }
            else {
                for (DataSnapshot npsnapshot : snapshot.getChildren()) {
                    message l = npsnapshot.getValue(message.class);
                    list.add(l);
                }

                messageAdapter.notifyDataSetChanged();
            }
        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError error) {
        throw error.toException(); // don't ignore errors
    }
});

还有一个Cloud Functions示例可以为您完成此服务器端操作:https://github.com/firebase/functions-samples/tree/master/limit-children