Android Firebase数据库中的读写值问题

Android Firebase数据库中的读写值问题,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,我想从Firebase中读取2个值(如果第一个用户不存在),如果需要,则更新它们。事实上,我一开始试着用一个值去做,但没有运气。我的代码是 mAuthListener = new FirebaseAuth.AuthStateListener() { @Override public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { FirebaseUser user

我想从Firebase中读取2个值(如果第一个用户不存在),如果需要,则更新它们。事实上,我一开始试着用一个值去做,但没有运气。我的代码是

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) {

                    }


                } );
我设法转换为null(作为score的第一个值不存在)并设置score。所以我的问题是为什么我不能更新这个值,我怎么能同时更新两个值呢?可能我必须使用事务,但我对它一点也不熟悉。我正在阅读,但我找不到如何将此代码转换为事务

更新

我试过交易

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);
                    }
                });

我有奇怪的结果。第一次什么都不做,然后添加分数和另一个irelavent用户值,然后在数据库中添加两个分数字段。

查看如何使用事务@道格·史蒂文森:我正在检查,但我发现更难理解。谢谢你的帮助。