У меня есть Collection в базе данных firebase, в которой есть определенное количество элементов, назовем его Collection "СЛЕДУЮЩИЕ". Это количество предметов будет постоянно меняться. В любой момент времени я хочу прослушать количество элементов в этом Collection и создать несколько вызовов whereEqualto() для объекта Query, основанного на другой «Коллекции», назовем это «ОПРОСЫ»:

        Query followingQuery = mStoreBaseRef.collection(USERS_LABEL).document(id).collection(FOLLOWING_LABEL);
        x = followingQuery.addSnapshotListener(new EventListener<QuerySnapshot>() {
        @Override
        public void onEvent(QuerySnapshot documentSnapshots, FirebaseFirestoreException e) {
            //This number is constantly changing, and I want to use it to query the "Polls" node
            int numberOfUsersFollowed = documentSnapshots.size();
            if (documentSnapshots.isEmpty() || documentSnapshots == null) {
                mRecyclerview.setVisibility(View.INVISIBLE);
                return;
            } else {
                Log.v("NUBER_OF_USER_FOLLOWED", String.valueOf(numberOfUsersFollowed));
                mFollowingUserQuery = mStoreBaseRef.collection(POLLS_LABEL);
                //Based on the number of users being "Followed," I want to search for those users' respective polls in the "Polls" node, and populate the RecyclerView based on this information
                for (DocumentSnapshot x : documentSnapshots) {
                    Following followedUser = x.toObject(Following.class);
                    String userID = followedUser.getUser_id();
                    Log.v("FOLLOWED_USER_ID", userID);
                    mFollowingUserQuery = mFollowingUserQuery.whereEqualTo(USER_ID_LABEL, userID);
                }

                FirestoreRecyclerOptions<Poll> storeOptions = new FirestoreRecyclerOptions.Builder<Poll>()
                        .setQuery(mFollowingUserQuery, Poll.class)
                        .build();

                mFirestoreAdaper = new FirestoreRecyclerAdapter<Poll, PollHolder>(storeOptions) {
                    @Override
                    protected void onBindViewHolder(@NonNull final PollHolder holder, final int position, @NonNull Poll model) {
                        holder.mPollQuestion.setText(model.getQuestion());
                        String voteCount = String.valueOf(model.getVote_count());
                        //TODO: Investigate formatting of vote count for thousands
                        holder.mVoteCount.setText(voteCount);
                        Picasso.with(getActivity().getApplicationContext())
                                .load(model.getImage_URL())
                                .fit()
                                .into(holder.mPollImage);
                        holder.mView.setOnClickListener(new View.OnClickListener() {
                            @Override
                            public void onClick(View view) {
                                Intent toClickedPoll = new Intent(getActivity(), PollHostActivity.class);
                                String recyclerPosition = getSnapshots().getSnapshot(position).getId();
                                Log.v("Firestore ID", recyclerPosition);
                                toClickedPoll.putExtra("POLL_ID", recyclerPosition);
                                startActivity(toClickedPoll);

                            }
                        });
                    }

                    @Override
                    public PollHolder onCreateViewHolder(ViewGroup parent, int viewType) {
                        View v = LayoutInflater.from(parent.getContext())
                                .inflate(R.layout.latest_item, parent, false);
                        return new PollHolder(v);
                    }
                };

                mRecyclerview.setAdapter(mFirestoreAdaper);
                scrollToPosition();
                mFirestoreAdaper.startListening();

            }
        }
    });

По сути, количество whereEqualTo() будет динамическим.

РЕДАКТИРОВАТЬ: Мой FirebaseUI RecylcerView не заполняет какие-либо данные на основе указанного выше запроса. У меня есть все эти методы в моем .onStart(), поэтому я ожидал, что в зависимости от изменений в «Следующем» узле он будет динамически заполняться, однако он пуст.

0
tccpg288 5 Май 2018 в 19:16

1 ответ

Лучший ответ

Похоже, вы ожидаете, что несколько предложений where будут действовать как логическое ИЛИ, и вы ожидаете, что вы получите документы, соответствующие любому из условий, которые вы указываете с помощью whereEqualTo. Это не то, как работают запросы Firestore. Когда у вас есть несколько условий, они действуют как логическое И, что означает, что все условия должны быть истинными, чтобы документ соответствовал запросу.

Если вам нужно логическое ИЛИ, вам придется выполнить несколько запросов для каждого из условий, а затем объединить результаты вместе. Это означает, что вы не сможете использовать FirestoreRecyclerAdapter, поскольку для этого требуется один запрос.

1
Doug Stevenson 5 Май 2018 в 16:49