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

时间:2018-09-05 19:45:15

标签: java android firebase firebase-realtime-database

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

1 个答案:

答案 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);
    }
});