использование setvalue в ondatachange с тем же классом

#android #firebase

#Android #firebase

Вопрос:

Я хочу прочитать данные из firebase, чтобы увеличить данные и записать обратно в firebase. Это моя функция:

         StatData = FirebaseDatabase.getInstance().getReference("Statistic");

        Getstat = FirebaseDatabase.getInstance().getReference("Statistic");
        Getstat.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                Stat stat = dataSnapshot.getValue(Stat.class);
                int count = stat.getStatP();
                int statP = count   1;
                Stat a = new Stat(statP);
                StatData.setValue(a);

            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });
  

Я использую тот же класс Stat для чтения и записи данных. Можно ли это использовать?

Комментарии:

1. Я полагаю, это сработает … но вы получите бесконечный цикл. Каждый раз, когда вы обнаруживаете изменения в GetStat прослушивателе, вы увеличиваете счетчик и фиксируете новые изменения в GetStat прослушивателе и увеличиваете его снова… Вы уверены, что это то, что вы хотите сделать? Это связано с тем, что обе ссылки относятся к одному и тому же пути в вашей базе данных

2. По сути, я просто хочу увеличить его один раз. Например, Getstat считывает данные из firebase, которые равны 1, затем после увеличения до 2 Statdata запишет их обратно в firebase как значение 2

Ответ №1:

Чтобы записать значение в узел, основанное на текущем значении этого узла, используйте транзакцию Firebase. Ваш пример будет примерно таким:

 postRef.runTransaction(new Transaction.Handler() {
    @Override
    public Transaction.Result doTransaction(MutableData mutableData) {
        Stat stat = mutableData.getValue(Stat.class);
        if (stat == null) {
            // Node doesn't exist or its value isn't known yet => return success
            return Transaction.success(mutableData);
        }
        int count = stat.getStatP();
        int statP = count   1;
        stat = new Stat(statP);

        // Set value and report transaction success
        mutableData.setValue(p);
        return Transaction.success(mutableData);
    }

    @Override
    public void onComplete(DatabaseError databaseError, boolean b, DataSnapshot dataSnapshot) {
        // Transaction completed
        Log.d(TAG, "statTransaction:onComplete:"   databaseError);
    }
});
  

Комментарии:

1. Спасибо за вашу помощь