通过.whereArrayContains()查询时发生意外行为

时间:2018-11-24 02:48:17

标签: java android firebase google-cloud-firestore firebaseui

我有一个RecycleerView,该视图利用FireaseUI并通过“时间戳”字段(依次)从“投票”节点订购所有对象。

新片段-.onViewCreated()

 Query queryStore = FirebaseFirestore.getInstance()
            .collection(POLLS_LABEL)
            .orderBy("timestamp", Query.Direction.ASCENDING);
    //Cloud Firestore does not have any ordering; must implement a timestampe to order sequentially

    FirestoreRecyclerOptions<Poll> storeOptions = new FirestoreRecyclerOptions.Builder<Poll>()
            .setQuery(queryStore, 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.get()
                    .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);

                }
            });
        }

我的应用程序中有另一个布局可以订阅相同的节点,但是可以通过“跟随者”然后通过“时间戳”进行查询。

以下片段-.onViewCreated()

  Query queryStore = FirebaseFirestore.getInstance()
            .collection(POLLS_LABEL)
            .whereArrayContains("followers", mUserId)
            .orderBy("timestamp", Query.Direction.ASCENDING);

    FirestoreRecyclerOptions<Poll> storeOptions = new FirestoreRecyclerOptions.Builder<Poll>()
            .setQuery(queryStore, 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.get()
                    .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);

                }
            });
        }

在第一种情况下,UI项在添加到Firebase中时实时填充到我的RecyclerView中。但是,当我通过“ .whereArrayContains”进行查询时,我没有得到相同的行为,并且我很好奇为什么。仅当我重新启动应用程序时,这些项目才会重新出现:

enter image description here

编辑:

我注释了以下内容:

// .whereArrayContains(“ followers”,mUserId)

并按预期执行行为,因此可以将问题隔离到.whereArrayContains()查询。这是每个片段之间的唯一区别。

1 个答案:

答案 0 :(得分:1)

之所以发生这种情况,是因为在同一查询中使用whereArrayContains()orderBy()方法时,需要index。要使用其中的一个,请转到Firebase Console并手动创建它,或者如果您使用的是Android Studio,则会在日志中找到听起来像这样的消息:

  

W / Firestore:(0.6.6-dev)[Firestore]:侦听查询(按时间戳表示array_array包含YourItem顺序的产品):Status {code = FAILED_PRECONDITION,description =查询需要索引。您可以在这里创建它:...

您只需单击该链接或将URL复制并粘贴到网络浏览器中,您的索引就会自动创建。

  

为什么需要该索引?

您可能已经注意到,Cloud Firestore中的查询非常快,这是因为Firestore会自动为文档中的任何字段创建索引。当您需要订购商品时,需要按照上面的说明创建一个特定的索引。但是,如果要手动创建索引,请从下拉菜单中选择相应的Array contains选项,如下图所示:

enter image description here