2017-07-20 19 views
0

使用Firebase编写我的第一个应用程序,并尝试将嵌套结构合并到一个POJO中,因为我将在同一屏幕上显示所有内容,但未能成功检索内部结构。 这里的快照:POJO中的HashMap用于嵌套Firebase结构

{ 
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 
      } 
     } 
    } 
    } 
} 

这里是我的课:

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

这里是我用来检查对象的代码:

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) { 

     } 
    }); 

第一个地图检索但不第二个。它永远不会进入每个人的内心。

+0

什么是'mUserRef1'指点? –

+0

指向特定用户创建的所有行程。 – Marcos

+0

你可以在你的代码中更新这个吗? –

回答

0

请使用此代码:

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

此代码将工作,如果你删除的日子节点按下的键。有两个孩子只需要一个孩子。您可以删除当天的数字,比如说第1天,第2天等,按下按键-KpMhSTQABFhbBHri0VU,-KpMhSTQABFhbBHri0AB。

你的日子节点应该是这样的:

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

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

感谢@AlexMamo,但我想知道如何将整个结构加载到POJO中。除了每天有几个ScheduleItems。我正在寻找这样的东西,但有一个额外的水平: https://stackoverflow.com/questions/42893231/creating-nested-object-firebase-structure – Marcos

+0

不,我没有。 :-( – Marcos