为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕哥6287543 2021-07-15 18:08:47
在我的 Firestore 中,我有一个users集合,其中的文档可以有一个bookmarks字段,它是一个引用数组:这些引用中的每一个都指向teachers集合中的一个文档:在我的 Android 应用程序中,我想创建一个方法getBookmarks,该方法返回一个ListPOJO,每个 POJO 代表一个老师。这是我编码的,但我认为有两个问题:我无法将 a 返回List<TeacherPojo>到 my 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>(并且可能不会对性能产生太大影响)?
查看完整描述

1 回答

?
拉风的咖菲猫

TA贡献1995条经验 获得超2个赞

是的。请查看以下代码行:


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。


查看完整回答
反对 回复 2021-07-29
  • 1 回答
  • 0 关注
  • 129 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信