Я хочу прочитать 2 значения из Firebase (если они существуют, как у первого пользователя, и их нет) и при необходимости обновить их. На самом деле я пытаюсь сначала сделать это с одним значением, без удачи. Мой код
mAuthListener = new FirebaseAuth.AuthStateListener() {
@Override
public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
if (user != null) {
final String uid = Objects.requireNonNull( mAuth.getCurrentUser() ).getUid();
mScoreReference.child( uid ).addListenerForSingleValueEvent( new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
User oldscore = dataSnapshot.getValue( User.class );
if (dataSnapshot.exists()) {
if(oldscore.getScore()==null){
oldscore.setScore(String.valueOf( 0));
String oldscorevalue = Objects.requireNonNull(oldscore).getScore();
int convertedscore = Integer.parseInt(oldscorevalue);
if (convertedscore > 0) {
//Upload points to Database
mScoreReference.child(uid).child( "Score" )
.setValue( convertedscore + newScore );
} else mScoreReference.child(uid).child( "Score" ).setValue( newScore );
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
} );
Мне удалось преобразовать ноль (первое значение, так как оценка не существует) и установить оценку. Поэтому моя проблема заключается в том, почему я не могу обновить значение, и как я могу обновить 2 значения одновременно? Вероятно, я должен использовать транзакцию, но я совсем не знаком с этим. Я читаю, но я не могу найти, как преобразовать этот код в транзакцию.
ОБНОВЛЕНИЕ
Я пытался с транзакцией.
mScoreReference.child( uid ).runTransaction(new Transaction.Handler() {
@Override
public Transaction.Result doTransaction(MutableData mutableData) {
User user = mutableData.getValue(User.class);
if (user.getScore() == null) {
mScoreReference.child(uid).child( "Score" ).setValue( newScore );
}
else{
String oldscorevalue = Objects.requireNonNull(user).getScore();
int convertedscore = Integer.parseInt(oldscorevalue);
mScoreReference.child(uid).child( "Score" )
.setValue( convertedscore + newScore );
}
// Set value and report transaction success
mutableData.setValue(user);
return Transaction.success(mutableData);
}
@Override
public void onComplete(DatabaseError databaseError, boolean b,
DataSnapshot dataSnapshot) {
// Transaction completed
Log.d(TAG, "postTransaction:onComplete:" + databaseError);
}
});
и у меня странные результаты. Сначала ничего не делайте, затем добавьте Score и другое значение irelavent User, а затем добавьте 2 поля Score в базе данных.