Чтение и запись значений в проблеме с базой данных Firebase - PullRequest
0 голосов
/ 28 октября 2019

Я хочу прочитать 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 в базе данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...