【问题标题】:Complex query on Firebase for AndroidFirebase for Android 上的复杂查询
【发布时间】:2016-12-31 00:56:09
【问题描述】:

我有如下数据结构。我需要像这样查询 FirebaseRecyclerAdapter;

 Query query = dbPosts.orderByChild("createDate").orderByChild("status").equlTo(0).orderByChild("voteSum").biggerThan(20);

我想先按创建日期排序,然后按具体情况排序,最后带上那些跟随某种情况的人。

我知道没有这样的规格,但我想,你明白我的意思。那么我怎样才能像这个查询一样,或者我怎样才能以其他方式来向 RecyclerView 表达我的愿望。

ps:对不起我的英语不好。

数据结构

"posts" : {
"-K_FaI8rsasB0hvFNTTv" : {
  "category" : 0, -> int
  "createdDate" : 1483115934775,
  "image" : "https://firebasestorage.googleapis.com/...",
  "status" : 0, -> int
  "title" : "sadfsadfsadf",
  "userId" : "iuHJQ044GrMPjRMF1CxPq15tp6g2",
  "username" : "someone",
  "voteSum" : 34 -> Long
},
"-K_GI57zSiPP6ETgctPD" : {
  "category" : 0, -> int
  "createdDate" : 1483127677924,
  "image" : "https://firebasestorage.googleapis.com/...",
  "status" : 0, ->int
  "title" : "qwewqeqwe",
  "userId" : "MWv568D0f3VO1y683kZumOQ7gHZ2",
  "username" : "idiots",
  "voteSum" : 13 -> Long
}

}

FirebaseRecyclerAdapter:

public FirebaseRecyclerAdapter recyclerAdapter(Query query) {

    FirebaseRecyclerAdapter<Post, PostViewHolder> firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<Post, PostViewHolder>(
            Post.class,
            R.layout.card_view_post,
            PostViewHolder.class,
            query
    ) {
        @Override
        protected void populateViewHolder(final PostViewHolder viewHolder, Post model, int position) {

            final String postId = getRef(position).getKey();
            // TODO sum vote
            viewHolder.setTitle(model.getTitle());
            viewHolder.setImage(getContext(), model.getImage());
            viewHolder.setSumVotes(postId);
            viewHolder.setSumComments(postId);
            if (checkAuthUser()) {
                viewHolder.setUpVote(postId);
                viewHolder.setDownVote(postId);
            }

            viewHolder.txtTitle.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Intent intent = new Intent(getActivity(), SinglePostActivity.class);
                    intent.putExtra(Enums.PostKeys.postId.getValue(), postId);
                    startActivity(intent);
                }
            });

            viewHolder.imvImage.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Intent intent = new Intent(getActivity(), SinglePostActivity.class);
                    intent.putExtra(Enums.PostKeys.postId.getValue(), postId);
                    startActivity(intent);
                }
            });

            viewHolder.imbComment.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Intent intent = new Intent(getActivity(), CommentsActivity.class);
                    intent.putExtra(Enums.PostKeys.postId.getValue(), postId);
                    startActivity(intent);
                }
            });


            viewHolder.imbUpVote.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {

                    if (!checkAuthUser()) {
                        startActivity(new Intent(getActivity(), SignUpActivity.class));
                        return;
                    }
                    processVote = true;

                    Singleton.getDbPostDownVote().child(postId).addValueEventListener(new ValueEventListener() {
                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot) {
                            if (processVote == true) {
                                if (dataSnapshot.hasChild(getUserId())) {
                                    Singleton.getDbPostDownVote().child(postId).child(getUserId()).removeValue();
                                }
                            }
                        }

                        @Override
                        public void onCancelled(DatabaseError databaseError) {

                        }
                    });

                    Singleton.getDbPostUpVote().child(postId).addValueEventListener(new ValueEventListener() {
                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot) {


                            if (processVote == true) {
                                if (dataSnapshot.hasChild(getUserId())) {
                                    Singleton.getDbPostUpVote().child(postId).child(getUserId()).removeValue();
                                    processVote = false;
                                } else {
                                    Singleton.getDbPostUpVote().child(postId).child(getUserId()).setValue(0);
                                    processVote = false;
                                }
                            }
                        }

                        @Override
                        public void onCancelled(DatabaseError databaseError) {

                        }
                    });

                }
            });

            viewHolder.imbDownVote.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {

                    if (!checkAuthUser()) {
                        startActivity(new Intent(getActivity(), SignUpActivity.class));
                        return;
                    }

                    processVote = true;

                    Singleton.getDbPostUpVote().child(postId).addValueEventListener(new ValueEventListener() {
                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot) {
                            if (processVote == true) {
                                if (dataSnapshot.hasChild(getUserId())) {
                                    Singleton.getDbPostUpVote().child(postId).child(getUserId()).removeValue();
                                }
                            }
                        }

                        @Override
                        public void onCancelled(DatabaseError databaseError) {

                        }
                    });

                    Singleton.getDbPostDownVote().child(postId).addValueEventListener(new ValueEventListener() {
                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot) {

                            if (processVote == true) {

                                if (dataSnapshot.hasChild(getUserId())) {
                                    Singleton.getDbPostDownVote().child(postId).child(getUserId()).removeValue();
                                    processVote = false;
                                } else {
                                    Singleton.getDbPostDownVote().child(postId).child(getUserId()).setValue(1);
                                    processVote = false;
                                }
                            }
                        }

                        @Override
                        public void onCancelled(DatabaseError databaseError) {

                        }
                    });

                }
            });


            viewHolder.imbMenu.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Context context = new ContextThemeWrapper(getContext(), R.style.popupMenuStyle);
                    PopupMenu popup = new PopupMenu(context, viewHolder.imbMenu);
                    //inflating menu from xml resource
                    popup.inflate(R.menu.post_menu);
                    //adding click listener
                    popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                        @Override
                        public boolean onMenuItemClick(MenuItem item) {
                            switch (item.getItemId()) {
                                case R.id.deletePost:
                                    break;
                                case R.id.reportPost:

                                    break;
                            }
                            return false;
                        }
                    });
                    //displaying the popup
                    popup.show();
                }
            });

        }


    };

    return firebaseRecyclerAdapter;
}

【问题讨论】:

    标签: android firebase android-recyclerview firebase-realtime-database


    【解决方案1】:

    首先阅读我之前关于同一主题的答案:Query based on multiple where clauses in firebase

    你有一个变种。您可以将statusvoteSum 值组合在一个属性中,然后在客户端执行createdDate 排序。

    "posts" : {
        "-K_FaI8rsasB0hvFNTTv" : {
          "status_voteSum": "0_34",
          "category" : 0,
          "createdDate" : 1483115934775,
          "image" : "https://firebasestorage.googleapis.com/...",
          "status" : 0,
          "title" : "sadfsadfsadf",
          "userId" : "iuHJQ044GrMPjRMF1CxPq15tp6g2",
          "username" : "someone",
          "voteSum" : 34
        },
        "-K_GI57zSiPP6ETgctPD" : {
          "status_voteSum": "0_13",
          "category" : 0,
          "createdDate" : 1483127677924,
          "image" : "https://firebasestorage.googleapis.com/...",
          "status" : 0,
          "title" : "qwewqeqwe",
          "userId" : "MWv568D0f3VO1y683kZumOQ7gHZ2",
          "username" : "idiots",
          "voteSum" : 13
        }
    }
    

    现在您可以使用status=0voteSum&gt;20 查询所有项目:

    ref.orderByChild("status_voteSum").startAt("0_21")...
    

    您仍然需要找到一种方法来重新排序 createdDate 客户端上的项目,因为该方法只能用于一个关系操作(最后的值)。

    除了我链接的答案之外,我们的视频系列Firebase for SQL developers 的其中一集也介绍了这种方法。

    【讨论】:

      猜你喜欢
      • 2021-09-01
      • 1970-01-01
      • 2019-10-16
      • 2016-10-15
      • 1970-01-01
      • 2020-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多