2017-08-01 12 views
1

だから、私はデータベースを持っていた:イベントとユーザー。firebaseにカウンターを追加するには?

ボタンをクリックしたイベントに関心があるユーザーがいる場合、イベントデータベースのユーザーと一緒にeventHasInterestに子が追加され、データベースにユーザーが関心のあるイベントを追加します。それはすでに機能していますが、私はショーにカウンタを置く必要があります。どれくらいの人が関心を持っていて、機能していないのですか?私は1つのクリック、+1、別のクリック-1を必要とする。

btn_interest.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 

      databaseEvent.child(getKeyEvent()).addListenerForSingleValueEvent(//get the event by key 
        new ValueEventListener() { 
         @Override 
         public void onDataChange(DataSnapshot dataSnapshot) { 

          final Event event = dataSnapshot.getValue(Event.class); 
          user = FirebaseAuth.getInstance().getCurrentUser(); //get the user logged in 
          if(user != null) { 

           databaseUser.orderByChild("userEmail").equalTo(user.getEmail()).addValueEventListener(new ValueEventListener() { 
            @Override 
            public void onDataChange(DataSnapshot dataSnapshot) { 

             for (DataSnapshot userSnapshot: dataSnapshot.getChildren()) { 

              final User user = userSnapshot.getValue(User.class); // user data logged in 

              databaseUser.orderByChild("userHasInterest").equalTo(event.getEventId()).addValueEventListener(new ValueEventListener() { 
               @Override 
               public void onDataChange(DataSnapshot dataSnapshot) { 
                if (!dataSnapshot.exists()) { 
                 databaseUser.child(user.getUserId()).child("userHasInterest").child(event.getEventId()).setValue(event.getEventId()); 
                 databaseEvent.child(event.getEventId()).child("eventAmount").setValue(dataSnapshot.getChildrenCount()+1); 
                } else { 
                 //event already exists 
                } 
               } 


               @Override 
               public void onCancelled(DatabaseError databaseError) { 
               } 
              }); 

              databaseEvent.orderByChild("eventHasInterest").equalTo(user.getUserId()).addValueEventListener(new ValueEventListener() { 
               @Override 
               public void onDataChange(DataSnapshot dataSnapshot) { 
                if(!dataSnapshot.exists()){ 
                 databaseEvent.child(event.getEventId()).child("eventHasInterest").child(user.getUserId()).setValue(user.getUserId()); 
                } else{ 
                 //user already exist 
                } 
               } 

マイfirebase: enter image description here

答えて

1

dataSnapshot.getChildrenCount()eventAmountのint型の値を返しませんが、それはeventAmountが持っている子の数を返します。あなたの場合、eventAmountの子がないので、eventAmountは常に0を返します。私は、getChildrenCountを使用する代わりに、dataSnapshotの値を取得し、その値をintに解析することをお勧めします。その後、その値を1だけ増分し、代わりにその値を保存します。

databaseEvent.child(event.getEventId()).child("eventAmount").setValue(Integer.parseInt(dataSnapshot.getValue().toString()) + 1); 

EDIT:トランザクションを使用して値を格納し、フランクによって示唆されるように同時更新を避けるために推奨されます。私はthis postを使用しただけでなく、ポストフランクはコードを書くのにリンクしました。

public void updateCount(DatabaseReference database){ 
    database.runTransaction(new Handler() { 
     @Override 
     public Result doTransaction(MutableData mutableData) { 

      //Currently no value in eventAmount 
      if(mutableData.getValue() == null){ 
       mutableData.setValue(1); 
      } 
      else{ 
       mutableData.setValue(Integer.parseInt(mutableData.getValue().toString()) + 1); 
      } 
      return Transaction.success(mutableData); 
     } 

     @Override 
     public void onComplete(DatabaseError databaseError, boolean b, 
      DataSnapshot dataSnapshot) { 
       //Probably log the error here. 
     } 
    }); 
} 

"userHasInterest" onDataChangeメソッドでは、上記のように私のメソッドを呼び出します。

@Override 
public void onDataChange(DataSnapshot dataSnapshot){ 
    if(!dataSnapshot.exists()) { 
     databaseUser.child(user.getUserId()).child("userHasInterest").child(event.getEventId()).setValue(event.getEventId()); 
     updateCount(databaseEvent.child(event.getEventId()).child("eventAmount")); //New line here 
    } else { 
     //event already exists 
    } 
} 
+1

これは1人の同時ユーザーしか存在しない場合でも機能しますが、複数のユーザーがいる場合は競合状態になります。 [トランザクション](https://firebase.google.com/docs/database/android/read-and-write#save_data_as_transactions)を使用すると、読み込みと書き込みを1つの呼び出しにまとめることができ、並行更新がカウントを失う危険性を排除します。 –

関連する問題