作为标题。即使我删除的孩子不存在,OnCompleteListener
也会触发。删除不存在的子级时,如何防止OnComplete(或OnSuccess)火灾?
这是代码:
ROOT_REF.child("111").removeValue().addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
Log.d("SSSSSSSSSSSSSSSSSSSS","onComplete");
}
});
注意:子级“ 111”不存在。
答案 0 :(得分:1)
在服务器上完成设置的状态时,将触发onComplete
侦听器。无法更改onComplete
侦听器的这种行为。
如果要确保只有一个用户可以删除一个值,并且知道它是当前用户,则应use a transaction。通过事务,您可以根据节点的当前值确定其新值。
ROOT_REF.child("111").runTransaction(new Transaction.Handler() {
@Override
public Transaction.Result doTransaction(MutableData mutableData) {
Object value = mutableData.getValue();
if (value == null) {
// Node doesn't exist
return Transaction.success(mutableData);
}
// Remove value and report transaction success
mutableData.setValue(null);
return Transaction.success(mutableData);
}
@Override
public void onComplete(DatabaseError databaseError, boolean b,
DataSnapshot dataSnapshot) {
// Transaction completed
Log.d(TAG, "postTransaction:onComplete:" + databaseError);
}
});
请注意:
doTransaction
方法可能会多次触发,恰好是在另一个用户已经修改了值之后。有关更多信息,请参见Firebase runTransaction not working - MutableData is null。