【问题标题】:Firebase Database Complex Querying Returning Incorrect ResultFirebase 数据库复杂查询返回不正确的结果
【发布时间】:2017-11-23 17:32:39
【问题描述】:

我有一个基本上如下所示的 Firebase 数据库:

最终,我试图捕捉“趋势”信息。 “趋势”将构成:

  1. 最近(添加到 Firebase 时)
  2. 高度评价(最高票数)

我在我的数据库中使用 FirebaseUI(最新版本 3.0.1)。我的查询如下:

    Query query = FirebaseDatabase.getInstance()
            .getReference()
            .child("Polls")
            .limitToLast(3)
            .orderByChild("vote_count");

       FirebaseRecyclerOptions<Poll> options = new FirebaseRecyclerOptions.Builder<Poll>()
            .setQuery(query, Poll.class)
            .build();


    mFireAdapter = new FirebaseRecyclerAdapter<Poll, PollHolder>(options) {
        @Override
        protected void onBindViewHolder(final PollHolder holder, int position, 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);
                    toClickedPoll.putExtra("POLL_ID", mFireAdapter.getRef(holder.getAdapterPosition()).getKey());
                    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);
        }
    };

希望首先查看最近添加的孩子,然后按 vote_count 孩子对这些孩子进行排序。不幸的是,这个查询没有正确处理,因为它首先按子排序,然后限制为 3。

我的查询可以吗? Cloud Firestore 的更新能否解决?

【问题讨论】:

    标签: java android firebase firebaseui


    【解决方案1】:

    为此,您需要使用以下代码行:

    DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
    Query query = rootRef.child("Polls").orderByChild("vote_count").limitToLast(3);
    query.addValueEventListener(/* ... */);
    

    【讨论】:

    • 所以我需要在recyclerview中使用查询之前添加valueeventlistener?
    • 不,这只是一个例子。该查询有效吗?
    • 我相信你的查询和我的一样?
    • 不是。顺序非常重要。使用 .limitToLast(3) 会将您的结果限制为最后 3 名,这可能不是最高票数。
    • 谢谢,我会试一试,我首先要限制,然后按子项排序。感谢你的帮助。感恩节快乐!
    【解决方案2】:

    AddorderByChild("vote_count")before limitToLast(3) 因为要解决您目前的情况,您需要先对点进行排序,即{1, 2, 3, 5, 6, 10, 15},然后将最后3个点{6, 10, 15}。

    这样

        Query query = FirebaseDatabase.getInstance()
                    .getReference()
                    .child("Polls")
                    .orderByChild("vote_count")
                    .limitToLast(3);
    

    【讨论】:

    • 我试过了,但还是不行,想象一下我有“第一:3,第二:1,第三:5。”然后我添加“Fourth”,这意味着“Fourth”成为最新的。无论“First”的值高于“Second”这一事实,它都应该自动取消“First”。如果限制为最后 3 个,“First”应该被淘汰,因为它不是最后 3 个之一。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-14
    • 2014-08-03
    相关资源
    最近更新 更多