读取和写入Firebase数据库问题中的值

时间:2019-10-28 20:13:50

标签: android firebase firebase-realtime-database

我想从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转换为空(第一个值不存在分数)并设置了分数。所以我的问题是为什么我不能更新值,以及如何同时更新2个值?可能我必须使用事务处理,但是对此我一点都不熟悉。我正在阅读,但找不到如何将此代码转换为Transaction。

更新

我尝试使用Transaction。

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值,然后在Database中添加2 Score字段。

0 个答案:

没有答案