Как я могу отфильтровать документы в Firestore на основе массива, хранящегося в другой коллекции? - PullRequest
1 голос
/ 01 июля 2019

У меня есть база данных Firestore, организованная следующим образом:

FirestoreDB FireStore DB

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

Ранее я пытался получить массив из Firestore и использовать этот массив для запроса сообщений следующих пользователей, но яЯ не могу получить доступ к массиву вне метода, который его генерирует, как описано здесь: https://firebase.google.com/docs/firestore/query-data/get-data#get_a_document

Примерно так:

DocumentReference docRef = db.collection("following").document(currentUser.getUid());
        docRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
            @Override
            public void onComplete(@NonNull Task<DocumentSnapshot> task) {
                if (task.isSuccessful()) {
                    DocumentSnapshot document = task.getResult();
                    if (document.exists()) {
                        List<String> group = (List<String>) document.get("following");
                    } else {
                    }
                } else {
                }
            }
        });

Query posts = db.collection("posts").whereEqualTo("userId", group);//Does not compile since cannot resolve group.

Где я тогда создал массив, используя DocumentSnapshotтак как мой запрос выходит за рамки метода, я не могу использовать созданный массив.

В настоящее время у меня не работает следующее:

Query posts = db.collection("posts").whereEqualTo("userId", FirebaseFirestore.getInstance()
                .collection("following")
                .document(currentUser.getUid()));

Спасибо за любую помощь вамможем предоставить.

окончательный выпуск

private void readData(MyCallback callback){
        DocumentReference docRef = db.collection("following").document(currentUser.getUid());
        docRef.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
            @Override
            public void onComplete(@NonNull Task<QuerySnapshot> task) {
                if (task.isSuccessful()) {
                    for (DocumentSnapshot document : Objects.requireNonNull(task.getResult())){
                        String group = document.getString("following");
                        followingList.add(group);
                    }
                    callback.onCallback(followingList);//says must be declared final
                } else {
                }
            }
        });
    }

1 Ответ

2 голосов
/ 01 июля 2019

В вашем коде есть две основные проблемы. Первый будет в следующей строке кода:

Query posts = db.collection("posts").whereEqualTo("userId", group);

Объект group не находится в области, где он определен, поэтому у вас есть ошибка компиляции. Кроме того, вы не можете передать метод whereEqualTo() в качестве второго аргумента списка. Если вы хотите создать новый запрос для каждого пользователя в вашем массиве, вы должны выполнить итерацию по нему и передать в качестве второго аргумента строку.

Вторая проблема заключается в том, что onComplete() имеет асинхронное поведение. Даже если вы создали список как глобальную переменную, он не будет работать, поскольку этот метод немедленно возвращает значение, и значение вашего списка group, который вы пытаетесь использовать вне метода onDataChange(), не будет заполнено от обратного вызова пока.

Быстрое решение этой проблемы - переместить указанную выше строку кода в метод onComplete() и передать строку, а , а не список, иначе я рекомендую вам просмотреть последнюю часть моего ответа. из этого поста , в котором я объяснил, как это можно сделать с помощью пользовательского обратного вызова. Вы также можете взглянуть на это видео для лучшего понимания.

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