java android firebase google-cloud-firestore

java - ¿Cómo devolver un DocumentSnapShot como resultado de un método?



android firebase (1)

Un objeto personalizado que toma un parámetro de (DocumentSnapShot documentsnapShot). También es un objeto interno de Firebase que recupera una instantánea y establece los valores para que mi modelo personalizado también tenga su argumento (DocumentSnapShot documentsnapShot). Sin embargo, deseo obtener los datos de Firebase y pasarlos a mi argumento personalizado porque el mío toma múltiples datos, no solo Firebase. Y no es posible iterar Firestore sin una anulación.

Aquí está el código:

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


No puede devolver algo ahora que aún no se ha cargado. Firestore carga los datos de asynchronously , ya que esto puede demorar un poco. Dependiendo de la velocidad de su conexión y el estado, pueden pasar de unos cientos de milisegundos a unos segundos antes de que esos datos estén disponibles. Si desea pasar el objeto de settings a otro método, simplemente llame a ese método dentro del método onSuccess() y pase ese objeto como argumento. Entonces, una solución rápida sería esta:

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

Una cosa más que mencionar es que no es necesario establecer esos valores en el objeto que ya los tiene. Ya está obteniendo los datos de la base de datos como un objeto.

Así que recuerde, el método onSuccess() tiene un comportamiento asíncrono, lo que significa que se llama incluso antes de obtener los datos de su base de datos. Si desea utilizar el objeto de settings fuera de ese método, debe crear su propia callback . Para lograr esto, primero debe crear una interfaz como esta:

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

Luego, debe crear un método que realmente obtenga los datos de la base de datos. Este método debería verse así:

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

Al final, simplemente llame readData() método readData() y pase una instancia de la interfaz MyCallback como argumento donde lo necesite de esta manera:

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

Esta es la única forma en que puede usar ese objeto de la clase onSuccess() fuera del método onSuccess() . Para obtener más información, también puede ver este video .