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

标签 java android firebase firebase-realtime-database

好的,所以我想知道 onChildRemoved 是如何实现的在 Firebase 实时数据库中工作。用户添加数据后,我就可以添加数据,即实时添加。但我想当用户删除数据时做同样的事情。如何继续呢?我阅读了文档但无法获取它。

任何帮助将不胜感激。

PS:我可以通过 mRootRef.child("message").removeValue(); 删除数据但我必须回去再次参加这个 Activity 才能看到变化。

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) {

                }
            });
        }

最佳答案

@mark922 的答案有要点,但您还需要执行一些步骤。

当您从数据库中删除消息时,您将在 onChildRemoved 中获得该已删除消息的 DataSnapshot。您将需要:

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

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

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

List<String> keyList = new ArrayList<String>();

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

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

现在您有了一个 keyList 和一个 messageList,并且每个索引处的项目彼此对应。所以keyList[0]中的key对应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();
}

关于消息插入的注释

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

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

所有这些并不是非常复杂,但是很容易出错。我建议看看 FirebaseArray class from FirebaseUI作为示例/灵感来源。

关于java - 如何在Firebase实时数据库中使用onChildRemoved?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52018612/

相关文章:

java - 比较数学表达式

android - Gradle 3.0.0-alpha1 与 kotlin-android 插件 1.1.2-3 不兼容?

javascript - vue.js 和 firebase 查询给出错误的数组计数

java - CSV 文件生成

java - Beancreationexception+NosuchBeandefinition异常

java - Java编程中的HashMap

java - 安卓媒体播放器无响应

用于选择文件的 android Intent 过滤器不适用于华为 P8 和 LG F70 手机

ios - 无法接收 FCM(推送通知 iOS)

android - 一段时间后,新的 Firebase 9 Android SDK 给出 "Invalid Idp response"