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

Cloud Firestore - получайте документы из разных мест

Когда пользователь проверяет свой список друзей в моем приложении, я хочу, чтобы приложение просматривало каждого пользователя в списке и получало его актуальную информацию из Cloud Firestore.

Это мой текущий код:

 final CollectionReference usersRef= FirebaseFirestore.getInstance().collection("users");

            usersRef.document(loggedEmail).collection("friends_list").get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
                @Override
                public void onSuccess(QuerySnapshot documentSnapshots) {
                    if (!documentSnapshots.isEmpty()){


                        for (DocumentSnapshot friendDocument: documentSnapshots) {

                            usersRef.document(friendDocument.getString("email")).get().addOnSuccessListener
                                    (new OnSuccessListener<DocumentSnapshot>() {
                                @Override
                                public void onSuccess(DocumentSnapshot documentSnapshot) {
                                    User friend=documentSnapshot.toObject(User.class);
                                friendsList_UserList.add(friend);

                                }
                            });

                        }


                        ///...

                    }

                    else
                        noFriendsFound();

                }

И это иллюстрация того, что я разыскиваю:

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

Как видите, таким способом я могу получить информацию о каждом пользователе, но я не могу найти способ прослушать этот процесс и продолжить, когда у меня будет информация обо всех друзьях в списке пользователя.

Есть ли способ получить сразу всю информацию о друзьях?


Ответы:


1

Firestore не поддерживает объединения напрямую, как вы просите.

Вы можете создать связанный прослушиватель, используя getDocumentChanges в QuerySnapshot, чтобы отслеживать друзей, которых следует слушать.

Представьте, что вы храните такую ​​карту регистрации друзей-слушателей.

Map<String, ListenerRegistration> friendListeners = new HashMap<>();

Тогда вы могли бы зарегистрировать что-то вроде этого:

usersRef.document(loggedEmail).collection("friends_list")
    .addSnapshotListener(new EventListener<QuerySnapshot>() {
      @Override
      public void onEvent(QuerySnapshot snapshot, FirebaseFirestoreException error) {
        for (DocumentChange change : snapshot.getDocumentChanges()) {
          DocumentSnapshot friend = change.getDocument();
          String friendId = friend.getId();
          ListenerRegistration registration;
          switch (change.getType()) {
            case ADDED:
            case MODIFIED:
              if (!friendListeners.containsKey(friendId)) {
                registration = usersRef.document(friendId).addSnapshotListener(null);
                friendListeners.put(friendId, registration);
              }
              break;

            case REMOVED:
              registration = friendListeners.get(friendId);
              if (registration != null) {
                registration.remove();
                friendListeners.remove(friendId);
              }
              break;
          }
        }
      }
    });

Однако учтите, что на самом деле это может быть не очень хорошая идея. Возможно, вам будет лучше поместить в документы friends_list достаточно информации, которая понадобится вам только для загрузки фактического пользовательского документа друга, когда вы действительно углубитесь в детали этого друга.

05.10.2017
Новые материалы

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

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

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

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

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

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

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