2017-02-17 103 views
1

我试图根据菜单类别检索一组餐馆菜单数据,并为每个菜单类别创建菜单项列表,并创建这些列表的HashMap,其中包含一个键类别。根据一组类别检索数据

下面的JSON树显示了我如何在餐馆ID下存储每个餐厅的菜单项。

"Menu" : { 
    "C39Jv1oVVdXbQdyCOcTQZyZnmC3x" : { //Restaurant ID 
     "applepie" : { 
     "item_category" : "Desserts", 
     "item_name" : "Apple Pie", 
     "item_price" : "280" 
     }, 
     "chocopudding" : { 
     "item_category" : "Desserts", 
     "item_name" : "Chocolate Pudding", 
     "item_price" : "320" 
     }, 
     "friedrice" : { 
     "item_category" : "Main Courses", 
     "item_name" : "Fried Rice", 
     "item_price" : "250" 
     }, 
     "seafoodrice" : { 
     "item_category" : "Main Courses", 
     "item_name" : "Sea Food Fried Rice", 
     "item_price" : "300" 
     } 
    } 
    } 

食物的类别每一家餐厅都存储在MenuCategories节点

"MenuCategories" : { 
    "C39Jv1oVVdXbQdyCOcTQZyZnmC3x" : { //Restaurant ID 
     "Desserts " : true, 
     "Main Courses" : true 
    } 
    } 

我试图根据上述数据集来实现是一样的东西:

  1. 列表1 :(菜单,菜单)//甜点
  2. 列表2 :(菜单,菜单)//主菜

这是我尝试(减去创建列表和HashMap的部分,以保持代码的简称):

数据库引用了两个节点:

mDatabase = FirebaseDatabase.getInstance().getReference().child("Menu").child(res_id); 
mMenuCategoryRef = FirebaseDatabase.getInstance().getReference().child("MenuCategories").child(res_id); 

数据检索:

List<String> menuCatList = new ArrayList<>(); 
mMenuCategoryRef.addListenerForSingleValueEvent(new ValueEventListener() { 
@Override 
public void onDataChange(DataSnapshot dataSnapshot) { 

    for(DataSnapshot data : dataSnapshot.getChildren()){ 

     menuCatList.add(data.getKey()); //adds all the categories to array list 

    } 

    for(String menuCat : menuCatList){ 

    //I'm trying to retrieve items under each category     
     mDatabase.orderByChild("item_category").equalTo(menuCat).addListenerForSingleValueEvent(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       for(DataSnapshot data : dataSnapshot.getChildren()){ 

        System.out.println("MenuListWithCat "+data.getKey()+" - "+data.getValue()); 
       } 

      } 
       ..... 

根据我的代码,我只接收具有“主课程”类别的项目,这是我的println打印的项目。

`System.out.println("MenuListWithCat "+data.getKey()+" - "+data.getValue());` 

    MenuListWithCat friedrice - {item_name=Fried Rice, item_category=Main Courses, item_price=250} 
    MenuListWithCat seafoodrice - {item_name=Sea Food Fried Rice, item_category=Main Courses, item_price=300} 

它完全跳过了“甜品”类别,为什么?

对此的任何帮助将是非常有帮助的。

+0

如果您在'mMenuCategoryRef'的'onDataChange'中放置了一条日志语句,是否打印?换句话说:它是否无法自行检索类别?或者是在内部循环中检索这些类别的菜单项失败。 –

+0

@FrankvanPuffelen是的,这两种类型都被检索并添加到'menuCatList'中。也许我用来在菜单节点下存储菜单项的结构不合适,有什么想法? – RamithDR

+1

那么....你的数据结构肯定看起来有点不寻常。由于您已经在'/ Menu/$ restaurantId'下为每个餐厅提供了商品类别,所以我不明白为什么您需要'/ MenuCategories/$ restaurantId'。但代码似乎很好,所以我不知道为什么它不读内循环中的菜单项。也许别人发现了什么是错的。 –

回答

1

我能弄明白。我在我的火力地堡数据检索过程复杂化,以使每个类别的菜单项单独的列表,我决定收回所有菜单项,并将其添加到一个ArrayList,而不考虑其类别类型,象下面这样:

mDatabase.addListenerForSingleValueEvent(new ValueEventListener() { 
@Override 
public void onDataChange(DataSnapshot dataSnapshot) { 

    for (DataSnapshot child : dataSnapshot.getChildren()) { 

     Menu menu = child.getValue(Menu.class); 
     menuList.add(menu); 

    } 

然后组根据自己的类别中的所有菜单项,并增加他们使用位Java逻辑的,这使我有以下格式的HashMap来单独列表:

Map<ItemCategory, ListofItems> 

这里的逻辑:

Map<String, List<Menu>> menuMap= new HashMap<String, List<Menu>>(); 

    for(Menu menuItem : menuList){ 

     List<Menu> tempList = menuMap.get(menuItem.getItem_category()); 

     if(tempList == null){ 

      tempList = new ArrayList<Menu>(); 
      menuMap.put(menuItem.getItem_category(), tempList); 

     } 

     tempList.add(menuItem); 
    } 

然后我从数据库中删除了不需要的MenuCategories节点,就像Frank在评论中提到的那样。

我希望这将有助于未来的人! :)

特别感谢@Frank宝贵的反馈和支持。