【问题标题】:How to display a document with its subcollections from Firestore in a RecyclerView with Android?如何在带有 Android 的 RecyclerView 中显示来自 Firestore 的文档及其子集合?
【发布时间】:2020-08-19 12:45:31
【问题描述】:

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

我有一个显示帖子列表的 RecyclerView。但我无法检索包含子集合的文档并将其放入对象中。当我在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 子集合。

还有其他解决方法吗?

【问题讨论】:

    标签: java android firebase android-recyclerview google-cloud-firestore


    【解决方案1】:

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

    你无法做到这一点。 Firestore 中的查询很浅,因此只允许从运行查询的集合中获取文档。此外,您无法一次将文档与嵌套的子集合一起获取。您可以获取文档,然后为每个子集合运行单独的查询。

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

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

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

    【讨论】:

    • 我使用了 AsyncTask,因为我无法在完成加载时重新提交列表。我在没有 AsyncTask 的情况下尝试了它,但程序只是同步运行并且列表保持为空。我一定会考虑尝试RDB
    【解决方案2】:

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

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

    按照 Alex 的建议切换到实时数据库可能不是一个好主意。仅仅为了获得深度查询,您将失去很多更复杂的查询能力,而且您甚至可能一直不想要完全深度的查询,因为总体而言这可能会更昂贵。

    【讨论】:

      猜你喜欢
      • 2020-04-16
      • 2021-01-08
      • 2021-07-27
      • 1970-01-01
      • 2018-08-22
      • 2020-01-22
      • 2020-07-11
      • 1970-01-01
      • 2021-08-12
      相关资源
      最近更新 更多