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:
-
No puedo devolver una
List<TeacherPojo>
a micallback
, porque recibo cada referencia de documento de forma individual -
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)?