Un objet personnalisé qui prend un paramètre de (DocumentSnapShot documentsnapShot). est également un objet interne de Firebase qui récupère un instantané et définit les valeurs de mon modèle personnalisé ont également son argument (DocumentSnapShot documentsnapShot). Cependant, je souhaite obtenir les données de Firebase et les transmettre à mon argument personnalisé car les miennes prennent plusieurs données non seulement Firebase. Et il n'est pas possible d'itérer Firestore sans dérogation.
Voici le code:
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"));
}
});
}
Vous ne pouvez pas retourner quelque chose qui n'a pas encore été chargé. Firestore charge les données asynchronously
, car cela peut prendre un certain temps. Selon la vitesse de votre connexion et l'état, il peut s'écouler de quelques centaines de millisecondes à quelques secondes avant que ces données soient disponibles. Si vous souhaitez passer settings
objet à une autre méthode, appelez simplement cette méthode dans la méthode onSuccess()
et passez cet objet en argument. Donc, une solution rapide serait la suivante:
@Override
public void onSuccess(DocumentSnapshot documentSnapshot) {
UserAccountSettings settings = documentSnapshot.toObject(UserAccountSettings.class);
yourMethod(settings);
}
Une autre chose à mentionner est que vous n'avez pas besoin de définir ces valeurs pour les objets qui les ont déjà. Vous obtenez déjà les données de la base de données en tant qu'objet.
N'oubliez donc pas que la méthode onSuccess()
a un comportement asynchrone, ce qui signifie qu'elle est appelée avant même que vous obteniez les données de votre base de données. Si vous souhaitez utiliser l'objet settings
en dehors de cette méthode, vous devez créer votre propre callback
. Pour ce faire, vous devez d'abord créer une interface comme celle-ci:
public interface MyCallback {
void onCallback(UserAccountSettings settings);
}
Ensuite, vous devez créer une méthode qui récupère réellement les données de la base de données. Cette méthode devrait ressembler à ceci:
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);
}
});
}
Au final, il suffit d'appeler la méthode readData()
et de passer une instance de l'interface MyCallback
comme argument partout où vous en avez besoin comme ceci:
readData(new MyCallback() {
@Override
public void onCallback(UserAccountSettings settings) {
Log.d("TAG", settings.getDisplay_name());
}
});
C'est la seule façon d'utiliser cet objet de la classe UserAccountSettings
en dehors de la méthode onSuccess()
. Pour plus d'informations, vous pouvez également consulter ceci vidéo.
Utilisez LiveData
comme type de retour et observez les changements de sa valeur pour exécuter l'opération souhaitée.
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;
}
Ensuite, à partir de votre Activity/Fragment
observez le LiveData
et à l'intérieur onChanged
faites l'opération souhaitée.
getUserSettings().observe(this, new Observer<UserAccountSettings>() {
@Override
public void onChanged(UserAccountSettings userAccountSettings) {
//here, do whatever you want on `userAccountSettings`
}
});