在Firestore中,我有一个users
集合,其中的文档可以有一个bookmarks
字段,该字段是引用数组:
每个引用都指向teachers
集合中的文档:
在我的Android应用中,我想创建一个方法getBookmarks
,该方法返回List
个POJO,每个POJO都代表一位老师。这是我编写的代码,但是我认为有两个问题:
List<TeacherPojo>
返回callback
,因为我得到的每个文档参考都是唯一的我认为为集合中的每个项目附加一个回调(由用户控制大小,用户可以根据需要添加任意数量的书签),这可能会对性能产生很大影响。
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?
});
});
});
}
是否有更好的方法来编写此方法,以获得List<TeacherPojo>
(并且可能不会对性能产生太大影响)?
答案 0 :(得分:1)
是的。请查看以下代码行:
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());
}
}
});
}
}
}
});
}
所以List<Object> list
实际上是包含类型TeacherPojo
的对象的列表。