Получить средний рейтинг Firebase Android

Я следую эта почта о том, как я могу получить среднее значение оценок, но получаю сообщение об ошибке:

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.fixitph.client, PID: 25744
com.google.firebase.database.DatabaseException: Failed to convert a value of type java.util.HashMap to double
at com.google.android.gms.internal.zzelw.zzbz(Unknown Source)
at com.google.android.gms.internal.zzelw.zzb(Unknown Source)
at com.google.android.gms.internal.zzelw.zza(Unknown Source)
at com.google.firebase.database.DataSnapshot.getValue(Unknown Source)
at com.fixitph.client.ReceiptActivity$2.onDataChange(ReceiptActivity.java:85)

Вот мой код:

ratingBar.setOnRatingChangeListener(new MaterialRatingBar.OnRatingChangeListener() {
    @Override
    public void onRatingChanged(MaterialRatingBar ratingBar, float rating) {
        final DatabaseReference dbRef = FirebaseDatabase.getInstance().getReference(Common.worker_rating_table)
                .child(Common.workerId).child(uid).child("Rating");

        double dbRating = rating;
        dbRef.setValue(dbRating);
    }
});

public void submitRating(View view) {
    final DatabaseReference dbRef = FirebaseDatabase.getInstance().getReference(Common.worker_rating_table)
            .child(Common.workerId);

    dbRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            double total = 0.0;
            double count = 0.0;
            double average = 0.0;
            for(DataSnapshot ds: dataSnapshot.getChildren()) {
                double rating = dataSnapshot.getValue(Double.class);
                total = total + rating;
                count = count + 1;
                average = total / count;
            }

            final DatabaseReference newRef = dbRef.child(uid);
            newRef.child("averageRating").setValue(average);
        }

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

Моя база данных выглядит следующим образом.

Получить средний рейтинг Firebase Android

Вот строка, которая относится к ReceiptActivity.java:85

double rating = dataSnapshot.getValue(Double.class);

Мне интересно, это потому, что я пытался найти Double, но в рейтингах есть Int, если это так, как я могу настроить это, чтобы получить среднее значение оценок? Пожалуйста помоги. Спасибо! :)

1
0
2 998
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

for(DataSnapshot ds: dataSnapshot.getChildren()) {
    double rating = Double.parseDouble(ds.child("Rating").getValue());
    total = total + rating;
    count = count + 1;
    average = total / count;
}

Вам нужно получить значение от дочернего элемента Rating и проанализировать его в double.

спасибо за идею, мне просто нужно было перебрать double rating = Double.parseDouble(ds.child("rating").getValue().toString())‌​;, и я смог получить нужный результат. Я обновлю свой вопрос, добавив в него коды.

ayabbear 31.03.2018 01:13
Ответ принят как подходящий
    ratingBar.setOnRatingChangeListener(new MaterialRatingBar.OnRatingChangeListener() {
            @Override
            public void onRatingChanged(MaterialRatingBar ratingBar, float rating) {
                final DatabaseReference dbRef = FirebaseDatabase.getInstance().getReference(Common.worker_rating_table)
                        .child(Common.workerId).child(Common.user_clients_table).child(uid).child("rating");

                double intRating = rating;

                dbRef.setValue(intRating);
            }
        });

        settingInformation();
    }

public void submitRating(View view) {
    try {
        final DatabaseReference db = FirebaseDatabase.getInstance().getReference();
        final DatabaseReference dbRef = db.child(Common.worker_rating_table).child(Common.workerId).child(Common.user_clients_table);

        dbRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                double total = 0.0;
                double count = 0.0;
                double average = 0.0;

                for(DataSnapshot ds: dataSnapshot.getChildren()) {
                    double rating = Double.parseDouble(ds.child("rating").getValue().toString());
                    total = total + rating;
                    count = count + 1;
                    average = total / count;
                }

                final DatabaseReference newRef = db.child(Common.worker_rating_table).child(Common.workerId).child("AverageRating");
                newRef.child("current").setValue(average);
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {
                throw databaseError.toException();
            }
        });
    } catch (Exception e) {
        Toast.makeText(ReceiptActivity.this, "" + e, Toast.LENGTH_SHORT).show();
    }
}

Мне пришлось добавить узлы, чтобы разделить текущее среднее значение и рейтинги клиентов, чтобы это могло работать. Вот так выглядит база данных:

Другие вопросы по теме