Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get list of documents from a collection in Firestore Android

My structure of Firestore database:

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

Now I wanna get list of document from root_collection. There would be a list with following data {"doc1", "doc2", "doc3"}. I need it because I want to make a spinner and put these data in the spinner. Then a user would be choose some document and download it.

I try to use the code below:

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

But the code works only then I have structure of data without collections in the documents. In other case there aren't any documents in QueryDocumentSnapshot.

Thanks!

like image 309
Ivan Banha Avatar asked Apr 26 '18 05:04

Ivan Banha


People also ask

How do I find out how many files are in my firestore collection?

count() allows you to determine the number of documents in a collection or query.

How do I query a collection in firestore?

To start querying a collection, you need to provide the hooks with a CollectionReference or Query reference created directly from the firebase/firestore library. The reference can be a simple collection pointer or a fully constrained query using the querying functionality provided by the Firestore SDK.


2 Answers

To have a list that contains all the name of your documents within the root_collection, please use the following code:

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

The result in your logcat will be:

[doc1, doc2, doc3]

Remember, this code will work, only if you'll have some properties within those documents, otherwise you'll end ut with an empty list.

like image 198
Alex Mamo Avatar answered Oct 03 '22 09:10

Alex Mamo


You can call collection method to get documentin the root_collections then hold documents ID which will be used to get document's collection later.

create root collection object as:

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

Then get the collection using FirebaseFirestore method collection as follows:

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

Then to get collection in the document call

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

Note that I have use kotlin coroutines await method as describe in this link

The Result class am using to save state of returned data and handle errors.

   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>()
   }
like image 28
Mihango K Avatar answered Oct 03 '22 08:10

Mihango K