java - Android फायरस्टार दस्तावेज़ के संदर्भ सरणी को सूची<पूजो> में परिवर्तित करता है



firebase google-cloud-firestore (1)

मेरे फायरस्टार में मुझे एक users संग्रह मिला है users जिसके भीतर दस्तावेज़ों का एक bookmarks फ़ील्ड हो सकता है, जो संदर्भों की एक सरणी है:

इनमें से प्रत्येक संदर्भ teachers संग्रह में एक दस्तावेज़ को इंगित करता है:

अपने एंड्रॉइड ऐप में, मैं एक विधि getBookmarks बनाना चाहता getBookmarks जो POJOs की List देता है जिसमें से प्रत्येक शिक्षक का प्रतिनिधित्व करता है। यह वही है जिसे मैंने कोडित किया है, लेकिन मुझे लगता है कि दो समस्याएं हैं:

  1. मैं अपने callback में एक List<TeacherPojo> नहीं लौटा सकता, क्योंकि मुझे प्रत्येक दस्तावेज़ संदर्भ एकवचन में मिल रहा है
  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> प्राप्त हो List<TeacherPojo> (और संभवतः प्रदर्शन पर बहुत अधिक प्रभाव डाले बिना)?


हाँ यही है। कृपया कोड की निम्नलिखित पंक्तियाँ देखें:

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





google-cloud-firestore