0

I want to increment score by 1 when user clicks a button, but value of score is not updated. When I updated it manually from Firebase console it updates. I don't know what the problem is. Can anyone help me, please?

 @Override
public void onClick(View view) {
    if (view == add) {
        score++;
        databaseReference1 = databaseReference.child("score");
        databaseReference1.setValue(String.valueOf(score));
        databaseReference1.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                textView_earning.setText(score + " ");
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });

    }
}
AL.
  • 36,815
  • 10
  • 142
  • 281
raj a
  • 9
  • 8
  • Move the addValueEventListener part outside onClick into onCreate/onStart, there is no need to call it each time you press the button because it already updates in realtime. – Linxy Feb 22 '17 at 21:44
  • please can we have a snap of your firebase please – Rajesh Satvara Feb 23 '17 at 04:41

4 Answers4

1

You have to add the value event listener before changing the value.

@Override
public void onClick(View view) {
    if (view == add) {
        score++;
        ref1 = ref.child("score");
        ref1.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                textView_earning.setText(score + " ");
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });
        ref1.setValue(String.valueOf(score));
    }
}
Jacob Phillips
  • 8,841
  • 3
  • 51
  • 66
0

If you place addValueEventListener inside onClick(), you'll end up attaching one more listener into databaseReference1 every time the button clicked. It is not a best practice as you'll face more kind of problem if it is clicked multiple time.

You should place addValueEventListener somewhere else, like (not limited to) in activity's onCreate() method:

... onCreate(...) {
    databaseReference1.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
}

And place score variable where it is easily got, and update it inside onDataChange() (for this example, I place it on scoreValue:

private String scoreValue;
... onCreate(...) {
    databaseReference1.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            scoreValue = dataSnapshot.getValue(String.class)
        }
...

And then inside onClick(), you just need to get scoreValue, increment it by 1, and save the value:

... onClick() {
    if (view == add) {
        scoreValue++;
        databaseReference.child("score").setValue(scoreValue);
    }
}

Then setValue(scoreValue) will update the value at the online database, and trigger onDataChange(). So don't worry if the value is changed online, scoreValue will always have updated value.

Hope this helps.

Note: all of this consider score value is at (your databaseReference path)\score

koceeng
  • 2,169
  • 3
  • 16
  • 37
0

you can use updateChildren for update single values.

Firebase ref = new Firebase(Constants.FIREBASE_URL);

    HashMap<String, Object> hm = new HashMap<String, Object>();
    hm.put("score",  score++);
    ref.child("YOUR_ROOT_NODE")
               .updateChildren(hm);
Rajesh Satvara
  • 3,842
  • 2
  • 30
  • 50
0

thanks all for your answer,the problem is fixed,actually i make a stupid mistake as i do not set on click listener on my button

raj a
  • 9
  • 8