Сумма значений массива поля Firestore - PullRequest
0 голосов
/ 07 января 2020

Я не могу найти сумму array в поле документа Firestore.

Независимо от того, что я делаю, я продолжаю получать следующую ошибку:

java .lang.ClassCastException: java .lang.Long не может быть приведен к java .lang.Integer

Мое требование следующее:

У меня есть коллекция БД -> "ALLUSERS", и каждый идентификатор документа является номером телефона пользователя.

Под этим документом у меня есть Коллекции "ХИМИЯ" и документ "Сводка". В этом у меня есть числовой массив глав с точками.

введите описание изображения здесь

Я могу получить эту деталь с помощью DocuementSnapshot.get (... глава...). Однако, как только я пытаюсь суммировать значения внутри массива, я получаю вышеупомянутую ошибку.

Ниже приведен код, в котором я пытался суммировать то же самое с потоком.

                         for (DocumentSnapshot document : task.getResult()) {
                                String phonenumber = document.getString("phonenumb");
                                students.add(phonenumber);
                                chemistry.document(phonenumber)
                                        .get()
                                        .addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
                                            @Override
                                            public void onComplete(@NonNull Task<DocumentSnapshot> task) {
                                                Map<String, Object> map = task.getResult().getData();

                                                for (Map.Entry<String, Object> entry : map.entrySet()) {
                                                    if (entry.getKey().contains("chemchaps")) {
                                                        List<String> stringList = (List<String>) entry.getValue();
                                                        List<Integer> integerList = stringList.stream()
                                                                .map(Integer::valueOf).collect(Collectors.toList());
                                                        Integer maxValue = Collections.max(integerList);
                                                        Toast("Max Value " + integerList + " " + maxValue);
                                                        for(int i = 0; i < maxValue; i++){
                                                            String chapterNo = "Chapter"+String.valueOf(maxValue);
                                                            String chapternumb = "chapter"+String.valueOf(maxValue);
                                                            chemistry.document(phonenumber).collection("CHEMISTRY").document("Summary")
                                                                    .get()
                                                                    .addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
                                                                        @Override
                                                                        public void onComplete(@NonNull Task<DocumentSnapshot> task) {
                                                                               if(task.isSuccessful()){
                                                                                   DocumentSnapshot documentSnapshot = task.getResult();
                                                                                   List<Integer> chaptersum = (List<Integer>) documentSnapshot.get(chapternumb);
                                                                                   long intsum = chaptersum.stream().mapToLong(Integer::longValue).sum();
                                                                                   //chaptersum.stream().reduce(0, (a, b)-> a+b);
                                                                                   //chaptersum.values().stream().mapToInt(Integer::intValue).sum();
                                                                                   Toast("Chapter Nos "+chapterNo + " "+ chaptersum+ " "+ intsum);
                                                                               }
                                                                        }
                                                                    });
                                                        }
                                                    }

                                                }
                                                Toast("Map data " + map);
                                            }
                                        });

Я получаю ошибка в этой строке:

long intsum = chaptersum.stream().mapToLong(Integer::longValue).sum();

Спасибо за помощь

1 Ответ

1 голос
/ 07 января 2020

Вы получаете следующую строку ошибки:

java .lang.ClassCastException: java .lang.Long не может быть приведен к java .lang.Integer

Поскольку вы добавлены к chapter1 номерам массивов, которые в основном хранятся как длинные значения, а не как целые числа. Чтобы решить эту проблему, измените следующие строки кода:

List<Integer> chaptersum = (List<Integer>) documentSnapshot.get(chapternumb);                                                                            
long intsum = chaptersum.stream().mapToLong(Integer::longValue).sum();

на

List<Long> chaptersum = (List<Long>) documentSnapshot.get(chapternumb);                                                                            
long intsum = chaptersum.stream().mapToLong(Long::longValue).sum();

Смотрите, список теперь имеет тип Long, и мы создаем сумму, используя Long значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...