Java 如何作为方法的结果返回DocumentSnapShot?

Java 如何作为方法的结果返回DocumentSnapShot?,java,android,firebase,google-cloud-firestore,Java,Android,Firebase,Google Cloud Firestore,获取(DocumentSnapShot DocumentSnapShot)参数的自定义对象。也是Firebase中的一个内部对象,用于检索快照并将值设置为“我的自定义模型”也有其参数(DocumentSnapShot DocumentSnapShot)。但是,我希望从Firebase获取数据,并将其传递给我的自定义参数,因为我的参数需要多个数据,而不仅仅是Firebase。如果没有覆盖,就不可能迭代Firestore 代码如下: public UserSettings getUserSettin

获取(DocumentSnapShot DocumentSnapShot)参数的自定义对象。也是Firebase中的一个内部对象,用于检索快照并将值设置为“我的自定义模型”也有其参数(DocumentSnapShot DocumentSnapShot)。但是,我希望从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"));
        }
    });
}
公共用户设置getUserSettings(DocumentSnapshot DocumentSnapshot){ d(标记“getUserSettings:从firestore检索用户帐户设置”); DocumentReference mSettings=mFirebaseFirestore.collection(“用户帐户设置”).document(用户ID); mSettings.get().addOnSuccessListener(新OnSuccessListener()){ @凌驾 成功时公共无效(文档快照文档快照){ UserAccountSettings设置=documentSnapshot.toObject(UserAccountSettings.class); settings.setDisplay_name(documentSnapshot.getString(“display_name”)); settings.setUsername(documentSnapshot.getString(“用户名”); settings.setWebsite(documentSnapshot.getString(“网站”); settings.setProfile_photo(documentSnapshot.getString(“profile_photo”); settings.setPosts(documentSnapshot.getLong(“posts”); setFollowers(documentSnapshot.getLong(“followers”); settings.setFollowing(documentSnapshot.getLong(“following”); } }); }
您现在无法返回尚未加载的内容。Firestore异步加载数据
,因为这可能需要一些时间。根据您的连接速度和状态,数据可用可能需要几百毫秒到几秒钟的时间。如果要将
settings
对象传递给另一个方法,只需在
onSuccess()方法中调用该方法并将该对象作为参数传递即可。因此,一个快速解决方案是:

@Override
public void onSuccess(DocumentSnapshot documentSnapshot) {
    UserAccountSettings settings = documentSnapshot.toObject(UserAccountSettings.class);
    yourMethod(settings);
}
还有一件事要提的是,您不需要将这些值设置为已经具有它们的对象。您已经将数据作为对象从数据库中获取

所以请记住,
onSuccess()
方法具有异步行为,这意味着即使在从数据库获取数据之前,也会调用该方法。如果要在该方法之外使用
设置
对象,则需要创建自己的
回调
。要实现这一点,首先需要创建如下界面:

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(new MyCallback() {
    @Override
    public void onCallback(UserAccountSettings settings) {
        Log.d("TAG", settings.getDisplay_name());
    }
});
然后,您需要创建一个从数据库中实际获取数据的方法。此方法应如下所示:

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