如何从Firestore Android中的集合中获取文档列表

时间:2018-04-26 05:56:25

标签: java android firebase google-cloud-firestore

我的Firestore数据库结构:

|
|=>root_collection
                  |
                  |=>doc1
                         |                  
                         |=>collection
                  |
                  |=>doc2
                         |                  
                         |=>collection
                  |
                  |=>doc3
                         |                  
                         |=>collection

现在我想从root_collection获取文件清单。会有一个包含以下数据{"doc1", "doc2", "doc3"}的列表。我需要它,因为我想创建一个微调器并将这些数据放在微调器中。然后用户将选择一些文档并下载它。

我尝试使用以下代码:

firestore.collection("root_collection")
            .get()
            .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                @Override
                public void onComplete(@NonNull Task<QuerySnapshot> task) {
                    if (task.isSuccessful()) {
                        for (QueryDocumentSnapshot document : task.getResult()) {
                            Log.d(TAG,document.getId() + " => " + document.getData());
                        }
                    } else {
                        Log.d(TAG, "Error getting documents: ", task.getException());
                    }
                }
            });

但是代码只有在我没有文档集合的数据结构时工作。在其他情况下,QueryDocumentSnapshot中没有任何文件。

谢谢!

3 个答案:

答案 0 :(得分:2)

要获得包含root_collection中所有文档名称的列表,请使用以下代码:

firestore.collection("root_collection").get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
    @Override
    public void onComplete(@NonNull Task<QuerySnapshot> task) {
        if (task.isSuccessful()) {
            List<String> list = new ArrayList<>();
            for (QueryDocumentSnapshot document : task.getResult()) {
                list.add(document.getId());
            }
            Log.d(TAG, list.toString());
        } else {
            Log.d(TAG, "Error getting documents: ", task.getException());
        }
    }
});

logcat的结果将是:

[doc1, doc2, doc3]
  

请记住,只有当您在这些文档中包含某些属性时,此代码才有效,否则您将以空列表结束。

答案 1 :(得分:0)

您可以调用collection方法在root_collections中获取文档,然后保存文档ID,该ID将在以后用于获取文档的收藏。

创建根集合对象为:

    data class RootCollection(
        @DocumentId val id: String,
        val sampleField: String?
    ) {
       // empty constructor to allow deserialization
       constructor(): this(null, null)
    }

然后使用FirebaseFirestore方法集合获取集合,如下所示:

    val querySnapshot = firestore.collection("root_collection")
                .get()
                .await()
    if(!querySnapshot.isEmpty) {
             Result.SUCCESS(querySnapshot.toObjects(RootCollection::class.java))
     } else {
         Result.ERROR(Exception("No data available"))
    }

然后在文档调用中获取收藏

    firestore.collection("root_collection/$documentId/collection") 

请注意,我已使用link

中所述的kotlin协程等待方法

Result类用于保存返回数据的状态并处理错误。

   sealed class Result<out T: Any> {
      data class SUCCESS<out T: Any>(val data: T) : Result<T>()
      data class ERROR(val e: Exception): Result<Nothing>()
      object LOADING : Result<Nothing>()
   }

答案 2 :(得分:-1)

好吧,我认为您现在不能执行此操作,因为Firestore无法提供有关子文档的此类了解。您的根集合只会知道其文档。

但是您可以做的是在Root集合的文档中获取对该集合的引用,然后就可以在该集合中获取这些文件。