2017-01-12 6 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です。 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クラスの実装では、私は子ノードをマップするようにマップしています。

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から挿入された順序と同じではありません。

私はdatasnapshotをチェックしましたが、それらは順序付けられていないFirebaseから来ています。私は​​またはgetChildren()が挿入された順序でデータを取得することを知っていますが、私は子の両方のためにしようとしていますmenusmenuitems

まとめて、menusmenuitemsを私が挿入した順番で全部restaurantとしたいと思います。私はこれを行うには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) { 

     } 
    }); 

あなたは、私がコメントしてくださいやっているのか理解していないと私は私の答えを編集します場合。

関連する問題