Android 为什么我在尝试删除某些内容时不断从Firebase获取重复数据?
为什么每次我试图从firebase中删除某些内容时都会不断获取重复数据?在我的onStart方法中,我成功地接收到了用户的信息,并且我试图删除一个特定的点击项,但每当我这样做时,我总是得到重复的数据。为什么会这样Android 为什么我在尝试删除某些内容时不断从Firebase获取重复数据?,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,为什么每次我试图从firebase中删除某些内容时都会不断获取重复数据?在我的onStart方法中,我成功地接收到了用户的信息,并且我试图删除一个特定的点击项,但每当我这样做时,我总是得到重复的数据。为什么会这样 //looped through Contact node access receiver UID and searched user ref for necessary information.. @Override public void 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所说,当您将
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();
}
});
}
}
在Firebase中,如果将侦听器附加到一个节点(父节点)并对其任何子节点进行更改,则无论更改类型如何,都会在父节点上获得数据更改更新。正因为如此,您在删除时收到了一个数据更改。@ImranMohammed听起来像是一个答案Imran:)