gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 07:01:02 27 4
gpt4 key购买 nike

好的,所以我想知道 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com