簡體   English   中英

如何作為方法的結果返回 DocumentSnapShot?

[英]How to return a DocumentSnapShot as a result of a method?

一個自定義的 object 參數為 (DocumentSnapShot documentsnapShot)。 也是來自 Firebase 的內部 object 檢索快照並將值設置為我的自定義 model 也有它的參數(DocumentSnapShot 文檔napShot)。 但是,我希望從 Firebase 獲取數據並將其傳遞給我的自定義參數,因為我不僅需要 Firebase 還需要多個數據。 如果沒有覆蓋,就不可能迭代 Firestore。

這是代碼:

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"));
        }
    });
}

您現在無法退回尚未加載的內容。 Firestore 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接口的實例作為參數傳遞到您需要的任何地方,如下所示:

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

這是您可以在onSuccess()方法之外使用UserAccountSettings類的該對象的唯一方法。 有關更多信息,您還可以觀看此視頻

使用LiveData作為返回類型並觀察其值的變化以執行所需的操作。

private MutableLiveData<UserAccountSettings> userSettingsMutableLiveData = new MutableLiveData<>();

public MutableLiveData<UserAccountSettings> getUserSettings(DocumentSnapshot documentSnapshot){

    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"));

            userSettingsMutableLiveData.setValue(settings);
        }
    });

    return userSettingsMutableLiveData;
}

然后從您的Activity/Fragment觀察LiveData並在onChanged內部執行您想要的操作。

getUserSettings().observe(this, new Observer<UserAccountSettings>() {
    @Override
    public void onChanged(UserAccountSettings userAccountSettings) {
        //here, do whatever you want on `userAccountSettings`
    }
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM