如何从 Firestore Android 中的收藏中获取文档列表

我的消防库数据库结构:

|
|=>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

谢谢!


答案 1

要在 中包含文档的所有名称的列表,请使用以下代码: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());
        }
    }
});

日志中的结果将是:

[doc1, doc2, doc3]

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


答案 2

您可以调用集合方法在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") 

请注意,我已经使用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>()
   }

推荐