Java firebase中的数据更改从第二次单击按钮开始,第一次单击不起任何作用
当我第一次单击按钮时,firebase中的数据不会更新,从第二次单击开始,只有数据会更新。 标志设置为false作为全局变量Java firebase中的数据更改从第二次单击按钮开始,第一次单击不起任何作用,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,当我第一次单击按钮时,firebase中的数据不会更新,从第二次单击开始,只有数据会更新。 标志设置为false作为全局变量 private void incrementDay(){ db_total = FirebaseDatabase.getInstance().getReference("Total Days"); db_total.addValueEventListener(new ValueEventListener() { @O
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();
}
});
}
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);
}
});
但请注意,您正在根据数据库的当前值更新数据库值。如果两个用户几乎同时执行此操作,则只有一个用户的写入操作会进入数据库。这就是为什么您应该始终将此类更新放入Firebase事务中的原因
比如:
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();
}
});
}
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);
}
});