Android Firestore:按文档值订购帖子

时间:2020-04-20 14:33:33

标签: android firebase google-cloud-firestore

我具有以下数据库配置: enter image description here

收藏集-> postID->在这里另一个名为LikesNumber-> document currentLikesNumber-> field currentNoOfLikes的收藏集

在我的应用程序中,我想根据某些功能对帖子进行排序。我已经实现了按帖子类别排序的代码,它是这样的:

public void getHorror(){
    blog_list = new ArrayList<>();
    blogRecyclerAdapter = new BlogRecyclerAdapter(blog_list);
    blog_list_view.setLayoutManager(new LinearLayoutManager(getActivity()));
    blog_list_view.setAdapter(blogRecyclerAdapter);
    blog_list_view.setHasFixedSize(true);
    firebaseAuth = FirebaseAuth.getInstance();


    if(firebaseAuth.getCurrentUser() != null) {
        firebaseFirestore = FirebaseFirestore.getInstance();
        blog_list_view.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
                Boolean reachedBottom = !recyclerView.canScrollVertically(1); //if we reach bottom
                if(reachedBottom){

                    loadMore();
                }
            }
        });

        Query firstQuery = firebaseFirestore.collection("Posts").whereEqualTo("category","Horror").orderBy("timestamp", Query.Direction.DESCENDING); //show newest posts first
        firstQuery.addSnapshotListener(new EventListener<QuerySnapshot>() {

            @Override
            public void onEvent(QuerySnapshot queryDocumentSnapshots, FirebaseFirestoreException e) {
                if (e == null) {
                    if (!queryDocumentSnapshots.isEmpty()) {
                        if (isFirstPageLoaded) {
                            lastVisible = queryDocumentSnapshots.getDocuments().get(queryDocumentSnapshots.size() - 1);
                            blog_list.clear();
                        }
                        for (DocumentChange doc : queryDocumentSnapshots.getDocumentChanges()) {
                            if (doc.getType() == DocumentChange.Type.ADDED) {
                                String blogPostId = doc.getDocument().getId();
                                BlogPost blogPost = doc.getDocument().toObject(BlogPost.class).withId(blogPostId);
                                if (isFirstPageLoaded) {
                                    blog_list.add(blogPost);
                                } else {
                                    blog_list.add(0, blogPost);
                                }
                                blogRecyclerAdapter.notifyDataSetChanged();
                            }
                        }
                        isFirstPageLoaded = false;
                    }
                }
            }
        });
    }
    blog_list.clear();
    blogRecyclerAdapter.notifyDataSetChanged();
}

基本上,当类别字段中包含给定的字符串时,我的回收站适配器将仅显示那些特定帖子。

现在,我想做同样的事情,但是我想按currentNoOfLikes从高到低对它们进行排序。我的问题是我不知道如何在currentNoOfLikes中访问数据。这就是我尝试过的

public void getLikesHL(){
    blog_list = new ArrayList<>();
    blogRecyclerAdapter = new BlogRecyclerAdapter(blog_list);
    blog_list_view.setLayoutManager(new LinearLayoutManager(getActivity()));
    blog_list_view.setAdapter(blogRecyclerAdapter);
    blog_list_view.setHasFixedSize(true);
    firebaseAuth = FirebaseAuth.getInstance();


    if(firebaseAuth.getCurrentUser() != null) {
        firebaseFirestore = FirebaseFirestore.getInstance();
        blog_list_view.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
                Boolean reachedBottom = !recyclerView.canScrollVertically(1); //if we reach bottom
                if(reachedBottom){

                    loadMore();
                }
            }
        });

        Query firstQuery = firebaseFirestore.collection("LikesNumber").orderBy("currentNoOfLikes",Query.Direction.DESCENDING); //show newest posts first
        firstQuery.addSnapshotListener(new EventListener<QuerySnapshot>() {

            @Override
            public void onEvent(QuerySnapshot queryDocumentSnapshots, FirebaseFirestoreException e) {
                if (e == null) {
                    if (!queryDocumentSnapshots.isEmpty()) {
                        if (isFirstPageLoaded) {
                            lastVisible = queryDocumentSnapshots.getDocuments().get(queryDocumentSnapshots.size() - 1);
                            blog_list.clear();
                        }
                        for (DocumentChange doc : queryDocumentSnapshots.getDocumentChanges()) {
                            if (doc.getType() == DocumentChange.Type.ADDED) {
                                String blogPostId = doc.getDocument().getId();
                                BlogPost blogPost = doc.getDocument().toObject(BlogPost.class).withId(blogPostId);
                                if (isFirstPageLoaded) {
                                    blog_list.add(blogPost);
                                } else {
                                    blog_list.add(0, blogPost);
                                }
                                blogRecyclerAdapter.notifyDataSetChanged();
                            }
                        }
                        isFirstPageLoaded = false;
                    }
                }
            }
        });
    }
    blog_list.clear();
    blogRecyclerAdapter.notifyDataSetChanged();
}

但是,当回收站适配器更新时,它为空。出于某种原因,我无法从currentNoOfLikes获取数据并将其从最高数值更新为最低数值(降序)。

1 个答案:

答案 0 :(得分:1)

更改此:

Query firstQuery = firebaseFirestore.collection("LikesNumber").orderBy("currentNoOfLikes",Query.Direction.DESCENDING); //show newest posts first

对此:

firebaseFirestore = FirebaseFirestore.getInstance();
Query firstQuery = firebaseFirestore.collection("Posts").document(postID).collection("LikesNumber").orderBy("currentNoOfLikes",Query.Direction.DESCENDING);

集合LikesNumber是一个子集合,因此要访问它,您需要通过Posts-> postsID-> LikesNumber然后可以获取数据。