Firebase多对多关系,如何检索数据

时间:2016-07-07 07:47:03

标签: android firebase-realtime-database

我的数据库结构如下所示:

enter image description here

现在我想只检索属于" menu1"的产品,然后用它们填充ListView,我已经有了类Products,有什么方法可以将查询与FireBaseListAdapter结合起来,首先得到属于菜单的所有产品(例如" menu1"或" menu2"),然后将它与FireBaseListAdapter一起使用,任何人都可以帮我查询,如何实现它?

p.s它适用于Android应用程序。

1 个答案:

答案 0 :(得分:2)

你可以在这里使用DatabaseReference,因为它扩展了Query类。

DatabaseRefernce mRef = FirebaseDatabase.getInstance()
                           .getReference("menus/menu1/listofproducts");

或者,如果您已经对要使用的根(restraunt-f08bd)有一个引用mRef,则可以使用以下查询

Query menu1ProductsRef = mRef.child("menus/menu1/listofproducts");

然后在其中一个上设置EventListener

在其中任何一个查询中,您都可以使用以下代码添加ChildEventListener

DatabaseReference productsRef = mRef.child("products");
menu1ProductsRef.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
            productsRef.child(dataSnapshot.getKey()).addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                //Add this product to your ListAdapter's ArrayList and notifyDataSetChanged()
                //Assuming you have a Product class with the necessary variables, getters and setters for these, and an empty constructor
                Product product = dataSnapshot.getValue(Product.class);
                productArrayList.add(product);
                productListAdapter.notifyDataSetChanged();
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });
        }

        @Override
        public void onChildChanged(DataSnapshot dataSnapshot, String s) {
            //Add the corresponding code for this case
        }

        @Override
        public void onChildRemoved(DataSnapshot dataSnapshot) {
            //Add the corresponding code for this case
        }

        @Override
        public void onChildMoved(DataSnapshot dataSnapshot, String s) {
            //Add the corresponding code for this case
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    })