Reputation: 19
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
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
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
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
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