java - एक विधि के परिणामस्वरूप DocumentSnapShot कैसे लौटाएं?



android firebase (1)

एक कस्टम ऑब्जेक्ट जो (DocumentSnapShot documentnapShot) के एक पैरामीटर लेता है। फायरबेस से एक आंतरिक वस्तु भी है जो एक स्नैपशॉट को पुनः प्राप्त करता है और मेरे कस्टम मॉडल में मान सेट करता है इसके तर्क (DocumentSnapShot documentnapShot) भी हैं। हालाँकि, मैं डेटा को Firebase से प्राप्त करना चाहता हूं और इसे अपने कस्टम तर्क में पास करना चाहता हूं क्योंकि मेरा कई डेटा केवल Firebase ही नहीं लेता है। और फायरस्टार को ओवरराइड के बिना पुनरावृत्त करना संभव नहीं है।

यहाँ कोड है:

public UserSettings getUserSettings(DocumentSnapshot documentSnapshot){
    Log.d(TAG, "getUserSettings: retrieving user account settings from firestore");

    DocumentReference mSettings = mFirebaseFirestore.collection("user_account_settings").document(userID);
    mSettings.get().addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
        @Override
        public void onSuccess(DocumentSnapshot documentSnapshot) {
            UserAccountSettings settings = documentSnapshot.toObject(UserAccountSettings.class);
            settings.setDisplay_name(documentSnapshot.getString("display_name"));
            settings.setUsername(documentSnapshot.getString("username"));
            settings.setWebsite(documentSnapshot.getString("website"));
            settings.setProfile_photo(documentSnapshot.getString("profile_photo"));
            settings.setPosts(documentSnapshot.getLong("posts"));
            settings.setFollowers(documentSnapshot.getLong("followers"));
            settings.setFollowing(documentSnapshot.getLong("following"));
        }
    });
}

आप अब कुछ वापस नहीं कर सकते हैं जो अभी तक लोड नहीं किया गया है। फायरस्टार डेटा को asynchronously से लोड करता है, क्योंकि इसके लिए कुछ समय लग सकता है। आपके कनेक्शन की गति और स्थिति के आधार पर, यह डेटा उपलब्ध होने से पहले कुछ सेकंड से कुछ सेकंड तक ले सकता है। यदि आप settings ऑब्जेक्ट को किसी अन्य विधि से पास करना चाहते हैं, तो बस उस विधि को onSuccess() विधि के अंदर कॉल करें और उस ऑब्जेक्ट को एक तर्क के रूप में पास करें। तो एक त्वरित सुधार यह होगा:

@Override
public void onSuccess(DocumentSnapshot documentSnapshot) {
    UserAccountSettings settings = documentSnapshot.toObject(UserAccountSettings.class);
    yourMethod(settings);
}

उल्लेख करने के लिए एक और बात यह है कि आपको उन मूल्यों को सेट करने की आवश्यकता नहीं है जो पहले से ही हैं। आप पहले से ही एक ऑब्जेक्ट के रूप में डेटाबेस से डेटा प्राप्त कर रहे हैं।

तो याद रखें, onSuccess() विधि में एक अतुल्यकालिक व्यवहार होता है, जिसका अर्थ है कि आपके डेटाबेस से डेटा प्राप्त करने से पहले भी इसे कहा जाता है। यदि आप उस विधि के बाहर settings ऑब्जेक्ट का उपयोग करना चाहते हैं, तो आपको अपना callback बनाने की आवश्यकता है। इसे प्राप्त करने के लिए, पहले आपको एक इंटरफ़ेस बनाने की आवश्यकता है:

public interface MyCallback {
    void onCallback(UserAccountSettings settings);
}

फिर आपको एक विधि बनाने की आवश्यकता है जो वास्तव में डेटाबेस से डेटा प्राप्त कर रही है। यह विधि इस तरह दिखनी चाहिए:

public void readData(MyCallback myCallback) {
    DocumentReference mSettings = mFirebaseFirestore.collection("user_account_settings").document(userID);
    mSettings.get().addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
        @Override
        public void onSuccess(DocumentSnapshot documentSnapshot) {
            UserAccountSettings settings = documentSnapshot.toObject(UserAccountSettings.class);
            myCallback.onCallback(settings);

        }
    });
}

अंत में बस readData() विधि को कॉल करें और MyCallback इंटरफ़ेस के एक उदाहरण को एक तर्क के रूप में MyCallback करें जहाँ आपको इस तरह की आवश्यकता हो:

readData(new MyCallback() {
    @Override
    public void onCallback(UserAccountSettings settings) {
        Log.d("TAG", settings.getDisplay_name());
    }
});

यह एकमात्र तरीका है जिसमें आप onSuccess() विधि के बाहर UserAccountSettings वर्ग के उस ऑब्जेक्ट का उपयोग कर सकते हैं। अधिक जानकारी के लिए, आप इस video भी देख सकते हैं।





google-cloud-firestore