繁体   English   中英

如何使用 Android 在 RecyclerView 中显示来自 Firestore 的文档及其子集合?

[英]How to display a document with its subcollections from Firestore in a RecyclerView with Android?

这是我的 Firestore 数据库的样子:

在此处输入图像描述

我有一个显示帖子列表的 RecyclerView。 但是我无法检索包含其子集合的文档并将其放入 object 中。当我在我的RecyclerView中提交帖子列表时,我希望每个帖子都已经有它的喜欢和评论。

我使用 AsyncTask 来完成查询用户所有帖子的后台工作。 AsyncTask 完成后,它会将帖子列表提交给 RecyclerView。 (还是不行)

在下面的代码中,我调用了用户的所有帖子,然后获取每个帖子的“赞”。 我在每篇文章中放置了一个 while 循环,这样我就可以等待它完成对赞的查询,然后再继续下一篇文章快照

doInBackground()

final List<Post> postList = new ArrayList<>();
// -- GET all the posts of the user
feedsCollection.document(documentID).collection("Posts").get()
    .addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
        @Override
        public void onSuccess(QuerySnapshot queryDocumentSnapshots) {

            for(final DocumentSnapshot documentSnapshot1 : queryDocumentSnapshots){
                final Post post = documentSnapshot1.toObject(Post.class);

                // Finish getting the likes&comments before proceeding
                while(post.isStillLoading()){
                    // -- GET Likes of each post
                    db.collection("FeedsCollection").document(documentID).collection("Posts")
                            .document(documentSnapshot1.getId()).collection("Likes").get()

                            .addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
                                @Override
                                public void onSuccess(QuerySnapshot queryDocumentSnapshots) {

                                    List<Like> likeList = new ArrayList<>();
                                    for(DocumentSnapshot likeSnapshot : queryDocumentSnapshots){
                                        Like like = likeSnapshot.toObject(Like.class);
                                        likeList.add(like);
                                    }
                                    post.setLikes(likeList);
                                    post.setStillLoading(false);

                                }
                            });
                    // -- GET comments code
                }
                postList.add(post);
            }
        }
    });
return postList;

onPostExecute()

    protected void onPostExecute(List<Post> postList) {
                super.onPostExecute(postList);
    
                adapter.submitData(postList);
    
    
            }

这些是我尝试过的事情:

  • 我尝试在我的 recyclerview 中使用多个视图类型,这样如果列表仍然是空的,它会显示“无项目”。 然后当 AsyncTask 完成时,它会重新提交一个列表到 recyclerview。
  • 我尝试使用 FirestoreRecyclerAdapter 但我读到它的查询很浅,所以它无法完全获取每个帖子文档的 Likes 和 Comments 子集合。

还有其他解决方法吗?

但是我无法检索包含其子集合的文档并将其放入 object 中。

你不可能做到这一点。 Firestore 中的查询很浅,因此只允许从运行查询的集合中获取文档。 此外,您无法在单个 go 中获取包含嵌套子集合的文档。您可以获取文档,然后对每个子集合运行单独的查询。

另一种可能的解决方案可能是使用Firebase Realtime Database ,当您下载一个节点时,您将它与该节点下存在的所有数据一起下载。

我使用 AsyncTask 来完成查询用户所有帖子的后台工作。

Cloud Firestore 客户端已在后台线程中运行 all.network 操作。 这意味着所有操作都不会阻塞您的主线程。 将它放在AsyncTask中不会带来任何额外的好处。

如果你有多个 collections 中的数据,甚至是嵌套的 collections,你将不得不执行多个查询来获取所有这些数据。 仅仅一个查询是不可能的。 你当然可以实现你想要的,只是这样做要复杂得多。

它将需要一个查询来获取 PostsCollection 中的所有文档,然后对每个帖子的 Comments 和 Likes 下嵌套的每个子集合进行更多查询。

按照 Alex 的建议切换到实时数据库可能不是一个好主意。 你将失去很多更复杂的查询能力,只是为了获得深度查询,你甚至可能不希望一直进行完全深度查询,因为这总体上可能更昂贵。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM