如何更新用户数据Firebase?

时间:2017-02-22 16:18:10

标签: android firebase firebase-realtime-database

我想在用户点击按钮时将分数增加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) {

            }
        });

    }
}

4 个答案:

答案 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)

感谢所有人的回答,问题已解决,实际上我犯了一个愚蠢的错误,因为我没有在我的按钮上设置点击监听器