Firebase数据库复杂查询返回不正确的结果

时间:2017-11-23 17:32:39

标签: java android firebase firebaseui

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

enter image description here

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

  1. 最近(当它被添加到Firebase时)
  2. 高度评价(最高投票数)
  3. 我在我的数据库中使用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的更新是否会解决?

2 个答案:

答案 0 :(得分:1)

要实现此目的,您需要使用以下代码行:

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

答案 1 :(得分:1)

orderByChild("vote_count")之前添加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);