2017-01-12 70 views
2

我試圖通過按鍵排序嵌套子元素來獲取Firebase的根。我的數據結構是這樣的:嵌套子元素中的Firebase orderbykey

"-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。 A restaurant可以有多個menusmenus可以有多個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根和其映射到類。但是,menumenuitems的順序與從Firebase插入的順序不同。

我檢查了數據快照,它們是從Firebase無序發出的。我知道​​或getChildren()獲取插入訂單的數據,但我正在嘗試爲訂單兒童menusmenuitems

綜上所述,我想得到整個restaurant根,它的menusmenuitems我插入它們的順序。我只想通過獲取restaurant root來執行此操作。有沒有辦法做到這一點?謝謝。

編輯:添加了上傳的數據的Restaurant.class和JSON版本。

+0

請考慮上載導出的JSON數據,而不是數據庫的屏幕截圖。你實現'Restaurant.class'也會有幫助。 – hotrod

+0

我認爲這種方式更直觀易懂。但我會編輯這個問題。 – starrystar

+0

只有在沒有**其他方式解釋你的意思時才應該上傳圖片。我指的是這個問題及其答案:http://meta.stackoverflow.com/questions/285551/why-may-i-not-upload-images-of-code-on-so-when-asking-a-問題 – hotrod

回答

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

     } 
    }); 

如果你不明白我在做什麼,請發表評論,我將修改我的答案。