Firebase 中的数据更改发生在第二次按钮单击时,第一次单击不执行任何操作



当我第一次点击按钮时,Firebase 中的数据不会更新,从第二次点击开始,只有数据会更新。 标志设置为假作为全局变量

private void incrementDay(){
db_total = FirebaseDatabase.getInstance().getReference("Total Days");
db_total.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
try {
getTotal =  (long)dataSnapshot.getValue();
setTotal=getTotal+1;
flag=true;
}catch( NullPointerException ne){
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
if(flag){
db_total.setValue(setTotal);
Snackbar.make(findViewById(android.R.id.content),"Days updated",Snackbar.LENGTH_SHORT).show();
}
}

数据是从 Firebase 异步加载的。任何需要数据的代码都需要位于加载数据时调用的onDataChange

所以像这样:

private void incrementDay(){
db_total = FirebaseDatabase.getInstance().getReference("Total Days");
db_total.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
getTotal =  (long)dataSnapshot.getValue();
setTotal=getTotal+1;
db_total.setValue(setTotal);
Snackbar.make(findViewById(android.R.id.content),"Days updated",Snackbar.LENGTH_SHORT).show();
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
throw databaseError.toException();
}
});
}

但请注意,您是根据数据库的当前值更新数据库值的。如果两个用户几乎同时执行此操作,则只有一次写入会进入数据库。因此,您应该始终将此类更新放入 Firebase 事务中。

像这样:

db_total.runTransaction(new Transaction.Handler() {
@Override
public Transaction.Result doTransaction(MutableData current) {
long count = current.getValue(Long.class);
mutableData.setValue(count + 1);
return Transaction.success(mutableData);
}
@Override
public void onComplete(DatabaseError databaseError, boolean b,
DataSnapshot dataSnapshot) {
// Transaction completed
Log.d(TAG, "updating count:" + databaseError);
}
});

最新更新