2017-01-12 2 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 может иметь несколько 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 like;

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.

Я проверил datasnapshot, они поступают из Firebase неупорядоченными. Я знаю, что orderbykey() или getChildren() получает данные с вставленным заказом, но я пытаюсь сделать для заказа как детей menus, так и menuitems.

Подводя итог, я хочу получить полный корень restaurant, его menus и menuitems заказ, который я их вставил. Я хочу сделать это, только получив корень restaurant. Есть ли способ сделать это? Спасибо.

EDIT: добавлена ​​версия загруженного файла 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) { 

     } 
    }); 

Если вы не понимаете, что я делаю, пожалуйста, комментарий и я буду править мой ответ.

Смежные вопросы