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