java android firebase google-cloud-firestore

java - Android Firestore convierte una matriz de referencias de documentos a la Lista<Pojo>



firebase google-cloud-firestore (1)

Sí lo es. Por favor vea las siguientes líneas de código:

FirebaseUser firebaseUser = FirebaseAuth.getInstance().getCurrentUser(); if (firebaseUser != null) { String uid = firebaseUser.getUid(); rootRef.collection("users").document(uid).get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() { @Override public void onComplete(@NonNull Task<DocumentSnapshot> task) { if (task.isSuccessful()) { DocumentSnapshot document = task.getResult(); if (document.exists()) { List<DocumentReference> list = (List<DocumentReference>) document.get("bookmarks"); List<Task<DocumentSnapshot>> tasks = new ArrayList<>(); for (DocumentReference documentReference : list) { Task<DocumentSnapshot> documentSnapshotTask = documentReference.get(); tasks.add(documentSnapshotTask); } Tasks.whenAllSuccess(tasks).addOnSuccessListener(new OnSuccessListener<List<Object>>() { @Override public void onSuccess(List<Object> list) { //Do what you need to do with your list for (Object object : list) { TeacherPojo tp = ((DocumentSnapshot) object).toObject(TeacherPojo.class); Log.d("TAG", tp.getFirstName()); } } }); } } } }); }

Por lo tanto, la List<Object> list es en realidad la lista que contiene objetos de tipo TeacherPojo .

En mi Firestore tengo una colección de users , dentro de la cual los documentos podrían tener un campo de bookmarks , que es una serie de referencias:

Cada una de estas referencias apunta a un documento en la colección de teachers :

En mi aplicación de Android, quiero crear un método getBookmarks que devuelva una List de POJOs, cada uno de los cuales representa un maestro. Esto es lo que codifiqué, pero creo que hay dos problemas:

  1. No puedo devolver una List<TeacherPojo> a mi callback , porque recibo cada referencia de documento de forma individual
  2. Creo que adjuntar una devolución de llamada para cada elemento de una colección (cuyo tamaño es controlado por el usuario, un usuario puede tener tantos marcadores como quiera) podría tener un gran impacto en el rendimiento.

    public void getBookmarks(@NonNull OnSuccessListener<List<TeacherPojo>> callback) { checkNotNull(callback); // document reference points to the user document which is calling this method documentReference.get() .addOnSuccessListener((documentSnapshot) -> { ArrayList<DocumentReference> teacherReferences = (ArrayList<DocumentReference>) documentSnapshot.get("bookmarks"); Iterables.forEach(teacherReferences, (documentReference) -> { documentReference.get() .addOnSuccessListener((teacherSnapshot) -> { TeacherPojo teacherPojo = teacherSnapshot.toObject(TeacherPojo.class); // now? }); }); }); }

¿Hay una mejor manera de codificar este método, para obtener una List<TeacherPojo> (y posiblemente sin tener demasiado impacto en el rendimiento)?