2017-02-22 67 views
0

我想在用户单击按钮时将分数加1,但分数值未更新。当我从Firebase控制台手动更新它时,它会进行更新。我不知道问题是什么。任何人都可以帮助我吗?如何更新用户数据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

移动的onClick外addValueEventListener部分进入的onCreate /调用onStart,有每次按下按钮时都不需要调用它,因为它已经实时更新。 – Linxy

+0

请问我们可以让你的firebase快照 –

回答

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

如果你把addValueEventListener里面onClick(),到头来你会多了一个监听器每次点击按钮时连接到databaseReference1。这不是一种最佳做法,因为如果多次单击它,您将面临更多类型的问题。

您应该将addValueEventListener其他地方,例如(不限于)在activityonCreate()方法:

... 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(),你只需要获得scoreValue,由1增加它,并保存值:

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

然后setValue(scoreValue)将更新的在线数据库的价值,并触发onDataChange()。所以不要担心,如果在线更改值,scoreValue将始终具有更新的值。

希望这会有所帮助。

注:所有这些考虑score值为(your databaseReference path)\score

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

感谢所有的回答,这个问题是固定的,其实我做一个愚蠢的错误,因为我不上点击监听器设置我的按钮