【问题标题】:Firebase orderbykey in the nested childs嵌套子项中的 Firebase orderbykey
【发布时间】:2018-05-07 01:40:44
【问题描述】:

我正在尝试使用按键排序的嵌套子级获取 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。一个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 之类的;

    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 版本。

【问题讨论】:

  • 请考虑上传导出的 JSON 数据,而不是您的数据库的屏幕截图。您对Restaurant.class 的实施也会有所帮助。
  • 我认为这种方式在视觉上更容易理解。但我会编辑这个问题。
  • 只有在没有其他方式来解释您的意思时才应该上传图片。我指的是这个问题及其答案:meta.stackoverflow.com/questions/285551/…
  • 如果您可以在本地(在您的代码中)对其进行排序,请查看名为 SortedList 的对象,它可以轻松组织排序列表。但是如果你必须在服务器上排序,它可能会更复杂。

标签: android firebase firebase-realtime-database


【解决方案1】:

试试这个:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-29
    • 2017-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-11
    • 1970-01-01
    相关资源
    最近更新 更多