嵌套子级中的Firebase orderbykey

时间:2017-01-12 07:56:36

标签: android firebase firebase-realtime-database

我正在尝试使用按键排序的嵌套子项来获取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 -> menuItemsrestaurant可以有多个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根并将其映射到类。但是,menumenuitems订单的顺序与从Firebase插入的顺序不同。

我检查了数据快照,它们来自Firebase无序。我知道orderbykey()getChildren()会使用插入的订单获取数据,但我正在尝试为子menusmenuitems订购。

总而言之,我希望获得整个restaurant根,menusmenuitems我插入它们的顺序。我想通过获取restaurant root来做到这一点。有没有办法做到这一点?谢谢。

编辑:添加了上传数据的Restaurant.class和JSON版本。

1 个答案:

答案 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) { }
    });

如果你不明白我在做什么,请发表评论,我会编辑我的答案。