Nano Hash - криптовалюты, майнинг, программирование

Java, Firestore - получите несколько документов из firestore, используя массив идентификаторов документов в android studio

У меня есть список ArrayList, содержащий все идентификаторы, которые я хочу получить. Есть ли способ получить несколько документов и их значения полей с помощью списка. Кроме того, если мне нужно вручную создать цикл for для получения каждого документа, как мне это сделать?

Структура данных Firestore:

Users:
  user1:
     field1 :
     field2 :
     field3 :
     field4 :
  user2:
     field1 :
     field2 :
     field3 :
     field4 :
  user3:
     field1 :
     field2 :
     field3 :
     field4 :

Список содержит: user1, user2, user3 и так далее ...

Изменить 1: я попытался получить его с помощью цикла for, но он дает исключение нулевого указателя в FriendsData.add(userDetails);

 for (String doc : list_of_Friends) {
                    FirebaseFirestore.getInstance().collection("Users").document(doc).get()
                            .addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
                                @Override
                                public void onSuccess(DocumentSnapshot documentSnapshot) {
                                    FamilyMember userDetails = documentSnapshot.toObject(FamilyMember.class);
                                    FriendsData.add(userDetails);
                                }
                            });

Изменить 2:

Другая логика цикла также дает ту же ошибку. Когда я регистрируюсь, я вижу, что оба doc и ds.getId() получают значения

FirebaseFirestore.getInstance().collection("Users").get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                        @Override
                        public void onComplete(@NonNull Task<QuerySnapshot> task) {
                            if(task.isSuccessful())
                            for (DocumentSnapshot ds : task.getResult()){
                                for (String doc : list_of_Friends) {
                                    if(ds.getId().equals(doc)){
                                        FriendsData.add(ds.toObject(FamilyMember.class));
                                    }
                                }

                            }
                        }
                    });

  • Какими способами вы пытались получить документы? 02.09.2020
  • Я попытался использовать цикл for для добавления каждого документа по одному, но он дает исключение с нулевым указателем 02.09.2020
  • Все ли документы имеют одинаковые атрибуты / поля? 02.09.2020
  • Да, у них одинаковое количество полей. 02.09.2020
  • Я обновил изменения, внесенные в цикл. Пожалуйста, проверьте 02.09.2020

Ответы:


1

Когда вы вызываете .get() для объекта DocumentReference, вы получаете обратно объект Task<DocumentSnapshot>.

Есть ли способ получить несколько документов и их значения полей с помощью списка.

Да, это так. Ключом к решению этой проблемы является _ 3_. В вашем конкретном случае код должен выглядеть так:

List<Task<DocumentSnapshot>> tasks = new ArrayList<>();
for (String doc : list_of_Friends) {
    tasks.add(FirebaseFirestore.getInstance().collection("Users").document(doc).get());
}

Tasks.whenAllSuccess(tasks).addOnSuccessListener(new OnSuccessListener<List<Object>>() {
    @Override
    public void onSuccess(List<Object> list) {
        //Do what you need to do with your list
        for (Object object : list) {
            FamilyMember fm = ((DocumentSnapshot) object).toObject(FamilyMember.class);
            Log.d("TAG", fm.getName());
        }
    }
});

Предполагая, что в вашем классе FamilyMember есть свойство с именем name и геттер с именем getName(), результатом в вашем журнале регистрации будут все имена всех членов семьи.

02.09.2020
  • Не ожидал получить от тебя ответ. Большое удовольствие. Ваши ответы помогли мне и раньше. 02.09.2020
  • Новые материалы

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

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..