我想在用户点击按钮时将分数增加1,但分数值不会更新。当我从Firebase控制台手动更新它时,它会更新。我不知道问题是什么。有人可以帮帮我吗?
@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) {
}
});
}
}
答案 0 :(得分:1)
您必须在更改值之前添加值事件侦听器。
@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));
}
}
答案 1 :(得分:0)
如果您将addValueEventListener
放在onClick()
内,则每次点击该按钮时,您最终会再将一个侦听器附加到databaseReference1
。这不是最佳实践,因为如果多次点击它会遇到更多问题。
您应该将addValueEventListener
放在其他地方,例如(不限于)activity
的{{1}}方法:
onCreate()
将得分变量置于容易获得的位置,并在... onCreate(...) {
databaseReference1.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
内更新(对于此示例,我将其放在onDataChange()
上:
scoreValue
然后在private String scoreValue;
... onCreate(...) {
databaseReference1.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
scoreValue = dataSnapshot.getValue(String.class)
}
...
内,您只需要获取onClick()
,将其递增1,然后保存该值:
scoreValue
然后... onClick() {
if (view == add) {
scoreValue++;
databaseReference.child("score").setValue(scoreValue);
}
}
将更新在线数据库中的值,并触发setValue(scoreValue)
。因此,如果值在线更改,请不要担心,onDataChange()
将始终具有更新的值。
希望这有帮助。
注意:所有这些都认为
scoreValue
值为score
答案 2 :(得分:0)
您可以使用 updateChildren 来更新单个值。
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);
答案 3 :(得分:0)
感谢所有人的回答,问题已解决,实际上我犯了一个愚蠢的错误,因为我没有在我的按钮上设置点击监听器