Java firebase中的数据更改从第二次单击按钮开始,第一次单击不起任何作用

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

当我第一次单击按钮时,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();
        }
    }

数据从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);
    }
});