Изменение данных в Firebase происходит от второго нажатия кнопки, первый щелчок ничего не делает - PullRequest
0 голосов
/ 05 сентября 2018

Когда я нажимаю кнопку в первый раз, данные не обновляются в базе данных, и со второго щелчка обновляются только данные. Флаг установлен как ложный как глобальная переменная

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 голосов
/ 05 сентября 2018

Данные загружаются из 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);
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...