【问题标题】:How to get list of documents from a collection in Firestore Android如何从 Firestore Android 中的集合中获取文档列表
【发布时间】:2018-10-06 17:25:43
【问题描述】:

我的 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中没有任何文件。

谢谢!

【问题讨论】:

    标签: java android firebase google-cloud-firestore


    【解决方案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());
            }
        }
    });
    

    您的 logcat 中的结果将是:

    [doc1, doc2, doc3]
    

    请记住,只有当您在这些文档中有一些属性时,此代码才有效,否则您将得到一个空列表。

    【讨论】:

    • 感谢您的支持,但不幸的是它不起作用。列表中没有任何文档 ID。据我所知,如果我在这些文档中添加一个字段,那么我可以获得文档的 ID。
    • 是的,没错。我假设您在这些文件中有一些内容。如果这些文档中没有某些属性,您将得到一个空列表。刚刚更新了我的答案。
    • 在我的情况下工作得很好我只想从数组中选择一个标题,然后我使用 ``` if (list.contains(documentName)){ //My action } ``
    • @SatyamGondhale 很高兴听到这个消息,Satyam。
    【解决方案2】:

    您可以在root_collections中调用collection方法获取document,然后保存documents ID,该ID将用于稍后获取document的集合。

    创建根集合对象为:

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

    然后使用FirebaseFirestore方法collection获取集合如下:

        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 协程 await 方法

    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>()
       }
    

    【讨论】:

      猜你喜欢
      • 2018-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-04
      • 1970-01-01
      • 1970-01-01
      • 2021-05-17
      • 2022-01-21
      相关资源
      最近更新 更多