2017-07-20 1 views
0

Coder ma première application avec Firebase et essayer d'obtenir une structure imbriquée dans un seul POJO car je vais tout afficher sur le même écran, mais sans réussir à récupérer la structure interne. Voici le cliché:Hashmaps dans POJO pour prendre en charge la structure Firebase imbriquée

{ 
key = -KIqtlY8VQFCuYmi-fWc, 
value = { 
    tripName=Paris in June, 
    cityId=paris, 
    arrivalDate=2310943, 
    duration=4, 
    days={ 
     day1={ 
      -KpMhSTQABFhbBHri0VU={ 
       keyItem=-KGYdK_RIc3Whm5Vp5WM, 
       orderItem=99, 
       typeItem=att 
      }, 
     day2={ 
      -KpMhSTQABFhbBHri0AB={ 
       keyItem=-KGYdK_RIc3Whm5Vp5WM, 
       orderItem=99, 
       typeItem=att 
      } 
     } 
    } 
    } 
} 

Voici mes classes:

@IgnoreExtraProperties 
public class Trip { 
    @Exclude 
    private String id; 
    private String cityId; 
    private String tripName; 
    private long arrivalDate; 
    private int duration; 
    private Map<String, DayTrip> days; // = new HashMap<String, DayTrip>(); 

    public Trip() { 
    } 

    public Trip(String cityId, String tripName, long arrivalDate, int duration, Map<String, DayTrip> days) { 
     this.cityId = cityId; 
     this.tripName = tripName; 
     this.arrivalDate = arrivalDate; 
     this.duration = duration; 
     this.days = days; 
    } 


    public String getId() { 
     return id; 
    } 

    public String getCityId() { 
     return cityId; 
    } 

    public String getTripName() { 
     return tripName; 
    } 


    public long getArrivalDate() { 
     return arrivalDate; 
    } 


    public int getDuration() { 
     return duration; 
    } 

    public Map<String, DayTrip> getDays() { 
     return days; 
    } 
} 

public class DayTrip { 
    private Map<String, ScheduledItem> scheduledItems; // = new HashMap<String, ScheduledItem>(); 

    public DayTrip() { 
    } 

    public DayTrip(String notes, Map<String, ScheduledItem> scheduledItems) { 
     this.scheduledItems = scheduledItems; 
    } 

    public Map<String, ScheduledItem> getScheduledItems() { 
     return scheduledItems; 
    } 
} 

public class ScheduledItem { 

    private String keyItem; 
    private String typeItem; 
    private int orderItem; 

    public ScheduledItem() { 

    } 

    public ScheduledItem(String keyItem, String typeItem, int orderItem) { 
     this.keyItem = keyItem; 
     this.typeItem = typeItem; 
     this.orderItem = orderItem; 
    } 

    public void setKeyItem(String keyItem) { 
     this.keyItem = keyItem; 
    } 

    public void setTypeItem(String typeItem) { 
     this.typeItem = typeItem; 
    } 

    public void setOrderItem(int orderItem) { 
     this.orderItem = orderItem; 
    } 

    public String getKeyItem() { 
     return keyItem; 
    } 
    public String getTypeItem() { 
     return typeItem; 
    } 
    public int getOrderItem() { 
     return orderItem; 
    } 
    @Exclude 
    public Map<String, Object> toMap() { 
     HashMap<String, Object> result = new HashMap<>(); 
     result.put("keyItem", keyItem); 
     result.put("typeItem", typeItem); 
     result.put("orderItem", orderItem); 

     return result; 
    } 
} 

Voici le code que je utilise pour inspecter l'objet:

mUserRef1 = mFirebaseRef.child("trips").child(getUid()); 

    mUserRef1.addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      for (DataSnapshot snap: dataSnapshot.getChildren()) { 
       Trip trip = snap.getValue(Trip.class); 
       for (Map.Entry<String, DayTrip> day: trip.getDays().entrySet()){ 
        for (Map.Entry<String, ScheduledItem> item: day.getValue().getScheduledItems().entrySet()) { 
         Log.d(TAG, item.getValue().getKeyItem()); 
        } 
       } 

      } 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 

La première carte est récupéré mais pas le deuxième. Il ne devient jamais le plus intérieur pour chacun.

+0

ce qui se pointer 'mUserRef1'? –

+0

Pointant vers tous les trajets créés par un utilisateur spécifique. – Marcos

+0

Pouvez-vous mettre à jour ceci dans votre code? –

Répondre

0

S'il vous plaît utiliser ce code:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference(); 
DatabaseReference uidRef = rootRef.child("trips").child(getUid()); 
ValueEventListener eventListener = new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     String tripName = dataSnapshot.child("tripName").getValue(String.class); 
     String cityId = dataSnapshot.child("cityId").getValue(String.class); 
     String arrivalDate = dataSnapshot.child("arrivalDate").getValue(String.class); 
     String duration = dataSnapshot.child("duration").getValue(String.class); 

     for(DataSnapshot ds : dataSnapshot.child("days").getChildren()) { 
      String keyItem = ds.child("keyItem").getValue(String.class); 
      String orderItem = ds.child("orderItem").getValue(String.class); 
      String typeItem = ds.child("typeItem").getValue(String.class); 
      Log.d("TAG", keyItem + "/" + orderItem + "/" + typeItem); 
     } 
    } 

    @Override 
    public void onCancelled(DatabaseError databaseError) {} 
}; 
uidRef.addListenerForSingleValueEvent(eventListener); 

Ce code ne fonctionnera que si vous retirez la clé poussé à partir du nœud jours. Il y a deux enfants quand un seul est nécessaire. Vous pouvez soit supprimer le numéro du jour, disons le jour 1, le jour 2 et ainsi de suite, soit la touche enfoncée -KpMhSTQABFhbBHri0VU, -KpMhSTQABFhbBHri0AB. noeud

Vos jours devrait ressembler à ceci:

days={ 
    day1={ 
      keyItem=-KGYdK_RIc3Whm5Vp5WM, 
      orderItem=99, 
      typeItem=att, 
    day2={ 
      keyItem=-KGYdK_RIc3Whm5Vp5WM, 
      orderItem=99, 
      typeItem=att, 
    } 
} 

ou

days={ 
    -KpMhSTQABFhbBHri0VU={ 
      keyItem=-KGYdK_RIc3Whm5Vp5WM, 
      orderItem=99, 
      typeItem=att, 
    -KpMhSTQABFhbBHri0AB={ 
      keyItem=-KGYdK_RIc3Whm5Vp5WM, 
      orderItem=99, 
      typeItem=att, 
    } 
} 
+0

Merci pour ce @AlexMamo mais je veux savoir comment charger la structure entière dans un POJO. En outre, il existe plusieurs ScheduleItems pour chaque jour. Je cherche quelque chose comme ceci mais avec un niveau supplémentaire: https://stackoverflow.com/questions/42893231/creating-nested-object-firebase-structure – Marcos

+0

Non, je n'ai pas. :-( – Marcos