2017-02-22 17 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の一部を移動をクリックしリスナーに設定しないと、実際に私はそこに、愚かなミスをし、固定されています。すでにリアルタイムで更新されているため、ボタンを押すたびに呼び出す必要はありません。 – 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

あなたはonClick()addValueEventListenerを配置する場合は、databaseReference1にボタンをクリックするたびに1人のより多くのリスナーを取り付けてしまいます。複数回クリックすると、より多くの種類の問題に直面するので、ベストプラクティスではありません。

あなたはどこか、(これらに限定されない)のようaddValueEventListenerを置くべきactivityonCreate()方法:この例では

... onCreate(...) { 
    databaseReference1.addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 

     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 
} 

と場所スコア、それが得やすくされている変数、およびonDataChange()内でそれを更新(

private String scoreValue; 
... onCreate(...) { 
    databaseReference1.addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      scoreValue = dataSnapshot.getValue(String.class) 
     } 
... 

をそしてonClick()の内側に、あなただけの、scoreValueを得る1で、それをインクリメントし、保存する必要があります、私はscoreValue上に置きます値:

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

その後setValue(scoreValue)がオンラインデータベースで値を更新し、onDataChange()がトリガされます。値がオンラインで変更されても心配しないでください。scoreValueは常に値を更新します。

これが役に立ちます。

注:このすべては、あなたが更新、単一の値のupdateChildrenを使用することができます(your databaseReference path)\score

0

score値があることを検討してください。すべてのあなたの答えのための

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

おかげで、問題は、私はのonCreate/ONSTARTに私のボタン

関連する問題