如何在Firebase实时数据库中使用onChildRemoved?

Ash*_*dav 0 java android firebase firebase-realtime-database

好的,所以我想知道onChildRemovedFirebase Realtime Databse中的工作原理。用户添加数据后,即可以实时添加数据。但是当用户删除数据时,我想做同样的事情。如何进行呢?我阅读了文档,但无法获取。

任何帮助将不胜感激。

PS:我可以删除数据,mRootRef.child("message").removeValue(); 但是我必须返回并再次参加此活动以查看更改。

private void loadmessage(String class_id, String email_red) {
            messageQuery.addChildEventListener(new ChildEventListener() {
                @Override
                public void onChildAdded(DataSnapshot dataSnapshot, String s) {

                    Message message = dataSnapshot.getValue(Message.class);
                    messageList.add(message);
                    mAdapter.notifyDataSetChanged();
                }

                @Override
                public void onChildChanged(DataSnapshot dataSnapshot, String s) {

                }

                @Override
                public void onChildRemoved(DataSnapshot dataSnapshot) {
                   //what to add here??
                }

                @Override
                public void onChildMoved(DataSnapshot dataSnapshot, String s) {

                }

                @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            });
        }
Run Code Online (Sandbox Code Playgroud)

Fra*_*len 5

@ mark922的答案具有要点,但您需要执行更多步骤。

当你从数据库中删除一个消息,你会得到一个DataSnapshot在删除消息onChildRemoved。您将需要:

  1. 在中找到相应的消息messageList
  2. 从列表中删除消息。
  3. 调用mAdapter.notifyDataSetChanged()以使适配器重新绘制列表/回收器视图。

棘手的是步骤1,因为这意味着您需要能够找到消息。最简单的方法是保留DataSnapshot.getKey()每个消息的。由于每个子节点的密钥必须唯一,因此每个密钥只能保证只有一条消息。

将其添加到当前代码的一种简单方法是添加一个keyList

List<String> keyList = new ArrayList<String>();
Run Code Online (Sandbox Code Playgroud)

然后在DataSnapshot添加值t时将每个键添加到该列表中messageList

public void onChildAdded(DataSnapshot dataSnapshot, String s) {
    Message message = dataSnapshot.getValue(Message.class);
    messageList.add(message);
    keyList.add(dataSnapshot.getKey());
    mAdapter.notifyDataSetChanged();
}
Run Code Online (Sandbox Code Playgroud)

现在,您有一个keyList和一个,messageList并且每个索引处的项目都彼此对应。因此,键keyList[0]对应于中的值messageList[0],等等。

这意味着,onChildRemoved你可以查找该在删除邮件的索引keyList,然后从两个该消息messageList,并keyList基于索引:

public void onChildRemoved(DataSnapshot dataSnapshot) {
    int index = keyList.indexOf(dataSnapshot.getKey());
    messageList.remove(index);
    keyList.remove(index);
    mAdapter.notifyDataSetChanged();
}
Run Code Online (Sandbox Code Playgroud)

有关邮件插入的说明

仅当新消息始终附加在列表末尾时,以上代码才有效。在一个简单的聊天应用中,这可能是正确的。但是在更先进的应用程序中,您也可以在列表中的其他位置插入数据。

在这种情况下String s,传入的密钥onChildAdded变得很重要,因为它实际上是String previousChildKey:插入新子级之前的子级的键。为了正确处理此情况,您应该跟踪项目的顺序,例如,通过将键和值插入相应列表中的正确索引中。那时,您还需要处理onChildChanged和(对于这种情况更重要)onChildMoved

所有这些都不是那么复杂,但是很容易出错。我建议看看FirebaseArrayFirebaseUI中的作为示例/灵感来源。