当我第一次单击按钮时,数据不会在firebase中更新,并且从第二次单击开始,仅更新数据。 标记设置为false作为全局变量
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();
}
}
答案 0 :(得分:1)
从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);
}
});