3
votes

Firestore récupère l'objet imbriqué et le convertit en POJO

J'ai des objets imbriqués dans Firestore où j'ai le document lié à l'UUID de l'utilisateur connecté.

Je peux extraire les valeurs imbriquées en les convertissant en Map et en appelant getData sur DocumentSnapshot. Puis boucle sur l'ensemble d'entrées de la carte. J'ai généralement utilisé les méthodes de Firestore pour convertir le résultat en mon objet personnalisé (par exemple documentSnapshot.toObject (POJO.class) et les jeter dans une liste, mais comme j'obtiens les valeurs imbriquées sous forme de carte, vais-je devoir utiliser quelque chose comme Jackson ou GSON? Une fois cette boucle terminée, je veux convertir en POJO et ajouter chacun à l'arraylist, dans ce cas allVehices.

public ArrayList<Vehicle> getAllVehicles() {
    FirebaseFirestore.getInstance().collection("vehicles")
            //.whereEqualTo("vehicleUUID",FirebaseAuth.getInstance().getCurrentUser().getUid())
            .get()
            .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                @Override
                public void onComplete(@NonNull Task<QuerySnapshot> task) {
                    if (task.isSuccessful()) {
                        for (DocumentSnapshot documentSnapshot : task.getResult()) {
                            Map<String,Object> map = (Map<String,Object>) documentSnapshot.getData();
                            for (Map.Entry<String,Object> entry : map.entrySet()) {
                                System.out.print(entry.getKey() + "/" + entry.getValue());

                            }
                        }
                    }
                }
            });

    return allVehicles;

}

Structure Firestore


0 commentaires

3 Réponses :


1
votes

Oui, vous devrez trouver votre propre solution à celui-ci, car le SDK Firestore ne prend actuellement pas en charge le mappage de champs individuels dans des objets Java. Cela ne fonctionne qu'avec tout le contenu du document pour le moment.

N'hésitez pas à déposer une demande de fonctionnalité si vous souhaitez le SDK pour fournir un moyen de faire ce mappage pour vous.


2 commentaires

Ah c'est ce que je commençais à penser ... alors dans ce cas, utiliser quelque chose comme GSON pour gérer ça serait mon meilleur pari?


Désolée, je ne connais pas vraiment GSON assez bien pour savoir s'il peut faire ce que vous voulez.



0
votes

GSON peut fonctionner comme une solution de contournement pour les documents qui contiennent des cartes que vous aimeriez avoir chacune comme leur propre objet individuel. Donc, si vous mappez des champs individuels dans des objets Java, le code ci-dessous est une solution de contournement pour les limitations du SDK, mais aura de moins bonnes performances que le SDK ou Jackson.

public ArrayList<Vehicle> getAllVehicles() {
    FirebaseFirestore.getInstance().collection("vehicles")
            //.whereEqualTo("vehicleUUID",FirebaseAuth.getInstance().getCurrentUser().getUid())
            .get()
            .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                @Override
                public void onComplete(@NonNull Task<QuerySnapshot> task) {
                    if (task.isSuccessful()) {
                        for (DocumentSnapshot documentSnapshot : task.getResult()) {
                            Map<String,Object> map = (Map<String,Object>) documentSnapshot.getData();
                            for (Map.Entry<String,Object> entry : map.entrySet()) { 
                                Gson gson = new Gson();
                                JsonElement jsonElement = gson.toJsonTree(entry.getValue());
                                MyPojo pojo = gson.fromJson(jsonElement, MyPojo.class);
                                pojo.setKeyName(entry.getKey());

                            }
                        }
                    }
                }
            });

    return allVehicles;

}


0 commentaires

0
votes

Il semble que cette fonctionnalité a été ajoutée dans la version 18.0.0 publié peu de temps avant que cette question ne soit posée. L'API Firestore Android prend en charge le mappage des champs d'objets imbriqués vers et depuis leurs classes respectives.

Parent.java

// Store Parent:
firestore.collection("collection")
    .document("id1")
    .set(myParent);  // Add appropriate listeners
// Retrieve Parent:
client.collection("collection")
    .document("id1")
    .get()
    // The returned Parent instance will have the child field set.
    .addOnSuccessListener(snapshot -> snapshot.toObject(Parent.class);

Child.java

public class Child {
  private String value;

  public Child () {
    this(null);
  }

  public Parent(String value) {
    this.value = value;
  }

  public String getValue() {
    return value;
  }
}


0 commentaires