Search code examples
javaandroidfirebaseaveragerating

Android Java get the average rating for each restaurant from Firebase


I have tried thousands of times to get the values from each restaurant and then get the average from those ratings for each one. Here is my firebase where there are 3 users who have rated the restaurants: Firebase database Here is my Java code:

private void displayRating(){ mRatingBar.setVisibility(View.VISIBLE); mRatingBar.setOnRatingBarChangeListener(new RatingBar.OnRatingBarChangeListener() { @Override public void onRatingChanged(RatingBar ratingBar, float rating, boolean fromUser) { final DatabaseReference mRatingDb = FirebaseDatabase.getInstance().getReference().child(namesList.get(pos)).child("rating").child(currentUserId); mRatingDb.setValue(rating); final DatabaseReference averageRatingDb = FirebaseDatabase.getInstance().getReference().child(namesList.get(pos)).child("Average");

            mRatingDb.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                    for (DataSnapshot ds : dataSnapshot.getChildren()) {
                        double total = 0.0;
                        double count = 0.0;
                        double rating = ds.child(currentUserId).getValue(double.class);
                        total = total + rating;
                        count = count + 1;
                        double average = total / count;
                        averageRatingDb.setValue(average);
                    }
                }
                @Override
                public void onCancelled(@NonNull DatabaseError databaseError) {

                }
            });

        }

    });
}

For a reason I feel that my for loop on onDataChange() is not working at all. I can't get any of the ratings so I can calculate the average rating.

How I am going to get the values from the users and then get the average for each restaurant separetly?

If someone can help please do, I'm so lost. Thank you.


Solution

  • You can try like this:

    final DatabaseReference mRatingDb = FirebaseDatabase.getInstance().getReference().child(namesList.get(pos)).child("rating").child(currentUserId);
    final DatabaseReference mQueryDb = FirebaseDatabase.getInstance().getReference().child(namesList.get(pos)).child("rating")
    final DatabaseReference averageRatingDb = FirebaseDatabase.getInstance().getReference().child(namesList.get(pos)).child("Average");
    double total = 0.0;
    double count = 0.0;
    mRatingDb.setValue(rating).addOnSuccessListener(new OnSuccessListener<Void>() {
            @Override
            public void onSuccess(Void aVoid) {
               mQueryDb.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                    for (DataSnapshot ds : dataSnapshot.getChildren()) {
                        double rating = ds.getValue(double.class);
                        total = total + rating;
                        count = count + 1;
                        double average = total / count;
                        averageRatingDb.setValue(average);
                    }
                }
                @Override
                public void onCancelled(@NonNull DatabaseError databaseError) {
    
                    }
                  });
    
                }
    
              }); 
            }
        });