#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. Спасибо за вашу помощь