java android firebase google-cloud-firestore illegalstateexception

java - ¿Cómo contar el número de documentos de una colección en Firestore?



android firebase (2)

Estoy tratando de obtener el recuento de CollectionReference que existe en Cloud Firestore, he intentado hacerlo con:

FirebaseFirestore db = FirebaseFirestore.getInstance(); final CollectionReference postsCollection = db.collection("Posts"); final TaskCompletionSource<Integer> source = new TaskCompletionSource<>(); new Thread(new Runnable() { @Override public void run() { int fromWhereToStart = postsCollection.get().getResult().size(); source.setResult(fromWhereToStart); } }).start(); Task<Integer> task = source.getTask(); task.addOnCompleteListener(new OnCompleteListener<Integer>() { @Override public void onComplete(@NonNull Task<Integer> task) { Log.e("Z_fromWhereToStart", "= " + task.getResult()); } });

Pero desafortunadamente, estoy obteniendo:

java.lang.IllegalStateException: Task is not yet complete

¿Hay otra forma de obtener el recuento de otra manera de arreglar la IllegalStateException ?


Debido a que no hay getDocumentCount() método getDocumentCount() como lo tenemos en la base de datos Firebase Realtime, un método getChildrenCount() , para contar realmente el número de todos los documentos debajo de su colección de Posts de su Cloud Firestore, use el siguiente código:

db.collection("Posts").get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() { @Override public void onComplete(@NonNull Task<QuerySnapshot> task) { if (task.isSuccessful()) { int count = 0; for (DocumentSnapshot document : task.getResult()) { count++; } Log.d("TAG", count + ""); } else { Log.d(TAG, "Error getting documents: ", task.getException()); } } });

o

db.collection("Posts").get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() { @Override public void onComplete(@NonNull Task<QuerySnapshot> task) { if (task.isSuccessful()) { Log.d("TAG", task.getResult().size() + ""); } else { Log.d(TAG, "Error getting documents: ", task.getException()); } } });

Los ejemplos anteriores funcionan lo suficientemente bien para conjuntos de datos pequeños, pero no funcionan si el datasete es más grande. Pero, también hay dos formas más en las que puedes lograr lo mismo.

Una forma sería usar Cloud Functions para actualizar un counter cada vez que agregue o elimine un documento de su colección de Posts . Esta tecnología funciona bien también para grandes conjuntos de datos. Pero tenga en cuenta que, en este caso, las adiciones y eliminaciones de documentos solo pueden ocurrir a una velocidad menor o igual a 1 por segundo, como se describe en Cloud Firestore Quotas and Limits . Es un documento único para leer, pero le muestra el conteo actual casi al instante.

Si necesita superar esta limitación, debe implementar distributed counters como se explica en la documentación oficial de los contadores distribuidos .

Como sugerencia personal, no almacene este tipo de contadores en Cloud Firestore, porque cada vez que aumente o disminuya el contador le costará una operación de read o write . Hospede este contador en la base de datos de Firebase Realtime sin costo .

La segunda forma sería, en lugar de usar Cloud Functions, usar transacciones en el lado del cliente, para actualizar el contador al mismo tiempo que agrega o elimina un documento. De esta manera, su contador también será preciso, ya que se actualiza al mismo tiempo. Pero lo más importante en este caso es que deberá asegurarse de incluir esta lógica en cualquier lugar donde agregue o elimine un documento. En este caso, puede usar la base de datos Firebase Realtime como weel, sin costo alguno.

Como conclusión, use el primer código para conjuntos de datos pequeños, el segundo use Cloud Functions porque es el mejor esfuerzo de tiempo de escritura y el tercer uso es la última opción que le he explicado anteriormente.


dentro de onCompelete () verifique if (task.isSuccessful()) antes de usar los registros. y también puede iterar sobre el documentSnapShot como for (DocumentSnapshot document : task.getResult()){ yourCounter++;} e incrementar el counter en cada iteración para saber cuántos documentos en la colección "Posts" están disponibles