android - 嵌套子项中的 Firebase orderbykey

标签 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 -> menuItems。一个餐厅可以有多个菜单,一个菜单可以有多个菜单项。他们插入了特定的 Firebase key 。代码,我正在获取数据

    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() 获取插入订单的数据,但我正在尝试为两个子 menus菜单项

总而言之,我想要获得整个 restaurant 根目录、它的 menusmenuitems 我插入它们的顺序。我只想通过获取 restaurant root 来做到这一点。有什么办法吗?谢谢。

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

最佳答案

试试这个:

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

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

关于android - 嵌套子项中的 Firebase orderbykey,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41607814/

相关文章:

android - 在 Android volley 中处理多个请求

java - 如何根据SeekBar的进度设置WaveView的波高?

java - 错误 :(93, 34) 错误:类 Request 中的构造函数 Request 无法应用于给定类型原因:实际参数列表和形式参数列表的长度不同

android - Firebase A/B 测试 - 不同设备上的相同用户 ID

android - 带有 Firebase 应用分发的 App Bundle

swift - 将来自 firebase 子键值对的数据存储为数组

android - 仅在 firebase 调用完成时加载布局

android - 在 Android 上以 Base64 格式转换文件 (<100Mo)

java - Android Studio 数组值到 TextView

ios - 删除 Firebase 中的字典元素