android - 为什么我在尝试删除某些内容时不断从 Firebase 获取重复数据?
问题描述
为什么每当我尝试从我的 Firebase 中删除某些内容时,我总是会收到重复的数据?在我的 onStart 方法中,我成功地收到了用户信息,并且我正在尝试删除特定的点击项目,但每当我这样做时,我都会不断收到重复的数据。为什么是这样?
//looped through Contact node access receiver UID and searched user ref for necessary information..
@Override
public void onStart() {
super.onStart();
contactsRef.child(currentFirebaseUser.getUid()).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot dsp : dataSnapshot.getChildren()) {
usersFriendsKey = dsp.getKey();
Log.i("friendsKey", usersFriendsKey);
usersRef.child(usersFriendsKey).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
userData = dataSnapshot.getValue(UserData.class);
contactsArrayList.add(userData);
chatListAdapter.notifyDataSetChanged();
}
@Override
public void onCancelled(DatabaseError databaseError) {
String error = databaseError.getMessage();
Toast.makeText(getActivity(), "Error occured", Toast.LENGTH_SHORT).show();
}
});
}
}
删除项目
//Creates popup and allows user to delete a post from recycle view...
public void deletePostMenu(final View v, final int position) {
PopupMenu popup = new PopupMenu(v.getContext(), v);
popup.getMenuInflater().inflate(R.menu.delete_menu, popup.getMenu());
selectedUserId = contactsArrayList.get(position).getUser();
popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.deleteMenu:
contactsRef.child(currentFirebaseUser.getUid()).child(selectedUserId).removeValue();
return true;
default:
//default intent
return true;
}
}
});
popup.show();
}
解决方案
就像 Imran 所说,当您将 an 附加addValueEventListener
到引用时,它将打开一个套接字以继续侦听对该引用的更改。
当您对该引用执行删除、更新或任何更改时,触发器将触发,您将从您的第一个代码片段在该引用处添加新元素。
你可以做的是附加一个addListenerForSingleValueEvent
,它只会触发一次。
因此,在您删除某个节点后,它不会触发正在侦听该节点的其他代码。
@Override
public void onStart() {
super.onStart();
contactsRef.child(currentFirebaseUser.getUid()).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot dsp : dataSnapshot.getChildren()) {
usersFriendsKey = dsp.getKey();
Log.i("friendsKey", usersFriendsKey);
usersRef.child(usersFriendsKey).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
userData = dataSnapshot.getValue(UserData.class);
contactsArrayList.add(userData);
chatListAdapter.notifyDataSetChanged();
}
@Override
public void onCancelled(DatabaseError databaseError) {
String error = databaseError.getMessage();
Toast.makeText(getActivity(), "Error occured", Toast.LENGTH_SHORT).show();
}
});
}
}
推荐阅读
- ios - 使用选项配置 firebase 在 Xcode 11 和 Firebase 6.19 中崩溃
- node.js - 为什么终端不显示其他 yargs 命令?
- android - Android 存储访问框架 - ParcelFileDescriptor - 写入文件时创建 0B 文件
- c# - 找到二维曲线的双切线的算法
- python - 如何通过 Telepot 在机器人电报中获取用户的位置和地点
- search - search-forward 和其他搜索函数的返回类型是什么?
- android - WiFi 建议 API 在 Android 上失败
- javascript - 了解 Svelte tick() 生命周期
- php - 如何通过MYSQL在按钮单击上切换布尔值
- if-statement - 未来
颤振中的 vs 布尔值