我正在尝试使用按键排序的嵌套子项来获取Firebase的根目录。我的数据结构是这样的:
"-Ka3rbdLvH0I8X1Lg4of" : {
"menus" : {
"-KaD6U8_n5CPbRmAhgM2" : {
"menuItems" : {
"-KaD6UEoDvrm1W1a55AR" : {
"name" : "Annemin Kahvaltısı"
},
"-KaD6UKf0DyPja-Rni0X" : {
"name" : "Sıcak Kahvaltı",
},
"-KaD6UQyrJ1p5Ok9oya4" : {
"name" : "Anadolu Kahvaltısı",
},
"name" : "Sahanda Ürünler"
},
"-KaD6VgvHIj37Qyrirw1" : {
"menuItems" : {
"-KaD6Von-sz1xqPLeI5I" : {
"name" : "Sade Omlet",
},
"-KaD6Vvg0cOBFuABbtuU" : {
"name" : "Mantarlı Omlet",
},
"name" : "Omletler"
},
我有restaurant -> menus -> menuItems
。 restaurant
可以有多个menus
,而menus
可以有多个menuitems
。它们插入了特定的Firebase密钥。代码,我得到数据
mDatabase.child("restaurants").child(lastResIdFirebaseKey).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
currentRest = snapshot.getValue(Restaurant.class);
tv_resName.setText(currentRest.getName());
tv_resDesc.setText(currentRest.getAddress());
iv_resImage.setImageResource(R.drawable.default_restaurant);
}
@Override
public void onCancelled(DatabaseError firebaseError) {
System.out.println("The read failed: " + firebaseError.getMessage());
}
});
在我的java类实现中;我将子节点映射到hasmap,如;
public HashMap<String,Menu> menus;
餐厅课程
public class Restaurant {
private String name;
private String description;
public HashMap<String,Menu> menus;
public Restaurant() {}
public Restaurant(String name, String descriptioArrayList<Menu> menus)
{
this.name = name;
this.description = description;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public HashMap<String, Menu> getMenus() {
return menus;
}
public void setMenus(HashMap<String, Menu> menus) {
this.menus = menus;
}
}
一切正常,我成功获取restaurant
根并将其映射到类。但是,menu
和menuitems
订单的顺序与从Firebase插入的顺序不同。
我检查了数据快照,它们来自Firebase无序。我知道orderbykey()
或getChildren()
会使用插入的订单获取数据,但我正在尝试为子menus
和menuitems
订购。
总而言之,我希望获得整个restaurant
根,menus
和menuitems
我插入它们的顺序。我想通过获取restaurant
root来做到这一点。有没有办法做到这一点?谢谢。
编辑:添加了上传数据的Restaurant.class和JSON版本。
答案 0 :(得分:0)
试试这个:
mDatabase.child("restaurants").child("restaurant_key").addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
ArrayList<Menu> menuArrayList = new ArrayList<>();
for(DataSnapshot menu : dataSnapshot.child("menus").getChildren()) {
ArrayList<String> menuItemArrayList = new ArrayList<>();
for(DataSnapshot menuItem : menu.child("menuItems").getChildren()) {
menuItemArrayList.add(menuItem.child("name").getValue().toString());
}
menuArrayList.add(new Menu(menu.child("name").getValue().toString(), menuItemArrayList));
}
currentRes = new Restaurant(dataSnapshot.child("name").getValue().toString(), dataSnapshot.child("description").getValue().toString(), menuArrayList);
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) { }
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) { }
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) { }
@Override
public void onCancelled(DatabaseError databaseError) { }
});
如果你不明白我在做什么,请发表评论,我会编辑我的答案。