How to save users score in firebase and retrieve it in real-time in Android studio

前端 未结 3 471
日久生厌
日久生厌 2020-11-22 10:12

I am creating an app in which points increases on button click and those points should be saved to firebase. I managed to save those data to firebase. But when I destroy my

3条回答
  •  野趣味
    野趣味 (楼主)
    2020-11-22 10:29

    Edit: 29th, June 2020

    Now it's also possible to solve this problem without the use of a transaction. We can simply increment a value using:

    rootRef.child("score").setValue(ServerValue.increment(1));
    

    And for decremenet, the following line of code is required:

    rootRef.child("score").setValue(ServerValue.increment(-1));
    

    This is how you set a value in your Firebase database:

    DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
    rootRef.child("score").setValue(1);
    

    Assuming that the your score field is of type Integer, to solve this, please use the following method:

    public static void setScore(String operation) {
        DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
        DatabaseReference scoreRef = rootRef.child("score");
        scoreRef.runTransaction(new Transaction.Handler() {
            @Override
            public Transaction.Result doTransaction(MutableData mutableData) {
                Integer score = mutableData.getValue(Integer.class);
                if (score == null) {
                    return Transaction.success(mutableData);
                }
    
                if (operation.equals("increaseScore")) {
                    mutableData.setValue(score + 1);
                } else if (operation.equals("decreaseScore")){
                    mutableData.setValue(score - 1);
                }
    
                return Transaction.success(mutableData);
            }
    
            @Override
            public void onComplete(DatabaseError databaseError, boolean b, DataSnapshot dataSnapshot) {}
        });
    }
    

    For this, I recommend you definitely use transactions. You will avoid wrong results if users are trying to increase/decrease the score in the same time. So as a conclusion, call this method accordingly to your increase/decrease operation.

    This is how you can read it:

    DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
    DatabaseReference scoreRef = rootRef.child("score");
    ValueEventListener eventListener = new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            Integer score = ds.getValue(Integer.class);
            Log.d("TAG", score + "");
        }
    
        @Override
        public void onCancelled(DatabaseError databaseError) {}
    };
    scoreRef.addListenerForSingleValueEvent(eventListener);
    

提交回复
热议问题