raj a
raj a

Reputation: 19

How to update user data Firebase?

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

            }
        });

    }
}

Upvotes: 0

Views: 1502

Answers (4)

raj a
raj a

Reputation: 19

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

Upvotes: 0

Jacob Phillips
Jacob Phillips

Reputation: 9264

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

Upvotes: 1

Rajesh Satvara
Rajesh Satvara

Reputation: 3954

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

Upvotes: 0

koceeng
koceeng

Reputation: 2163

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

Upvotes: 0

Related Questions