Android Firestore将文档引用数组转换为List <pojo>

时间:2018-08-17 09:51:30

标签: java android firebase google-cloud-firestore

在Firestore中,我有一个users集合,其中的文档可以有一个bookmarks字段,该字段是引用数组:

Firestore bookmarks example

每个引用都指向teachers集合中的文档:

Teacher example

在我的Android应用中,我想创建一个方法getBookmarks,该方法返回List个POJO,每个POJO都代表一位老师。这是我编写的代码,但是我认为有两个问题:

  1. 我无法将List<TeacherPojo>返回callback,因为我得到的每个文档参考都是唯一的
  2. 我认为为集合中的每个项目附加一个回调(由用户控制大小,用户可以根据需要添加任意数量的书签),这可能会对性能产生很大影响。

    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>(并且可能不会对性能产生太大影响)?

1 个答案:

答案 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的对象的列表。