【问题标题】:fetch subsequent data in one go in firebase在firebase中一次性获取后续数据
【发布时间】:2016-10-02 00:06:52
【问题描述】:

以下是我的架构,其中一位用户分配了特定订单,一个订单可能有多个项目

Master JSON
-----------
users
    user-id
        email
        username

orders
    order-id
        orderNo
        orderStatus
        deliveryDate

items
    item-id
        itemNo
        itemName
        itemQty
        itemPrice

Related JSON    
------------
    user-orders
        user-id
            order-id                
                orderNo
                orderStatus
                deliveryDate

    order-itmes
        order-id
            item-id
                itemNo
                itemName
                itemQty
                itemPrice

我正在访问属于一个用户的所有订单,如下所示

dbRef.child("user-orders").child(userId);

ChildEventListener中更新listview如下

 public void onChildAdded(DataSnapshot dataSnapshot, String s) {

            Order order = dataSnapshot.getValue(Order.class);
            listview.add(order);
            adapter.notifyParentItemInserted(listview.size()-1);

        }

但同时我想获取属于所有订单的所有项目,因此我需要在onChildAdded 中使用以下查询,并且需要另一个ChildEventListener 侦听器。

dbRef.child("order-items").child(dataSnapshot.getKey());/ /key of newly fetched order.

所以问题是,firebase 有什么方法可以获取属于一个侦听器内所有订单的所有项目?就像我一次性传递所有订单键以获取属于这些订单的所有商品。

我只在一个列表上显示订单和项目的详细信息,因此我需要同时获得这两个数据

编辑

调用命令

 public void readOrders(String userId){

        mOrderQuery = mDatabaseRef.child("user-orders").child(userId);
        mOrderQuery.addChildEventListener(mOrderEventListener);

    }

监听器读取命令

private ChildEventListener mOrderEventListener = new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {

            Order order = dataSnapshot.getValue(Order.class);
            orderList.add(order);
            // fetching items belong to specific order 
            mItemQuery = mDatabaseRef.child("order-items").child(dataSnapshot.getKey());

            // problem is here for every order i have to register a event listener and this not the right way to do it 
            mItemQuery.addChildEventListener(mItemEventListener);


        }

        public void onChildChanged(DataSnapshot dataSnapshot, String s) { }
        public void onChildRemoved(DataSnapshot dataSnapshot) { }
        public void onChildMoved(DataSnapshot dataSnapshot, String s) { }
        public void onCancelled(DatabaseError databaseError) {
            Log.e(TAG , "onCancelled called");
        }
    };

监听器读取项目

private ChildEventListener mItemEventListener = new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {

            Item item = dataSnapshot.getValue(Item.class);
           // here i need to map the incoming item to specific order list


        }

        public void onChildRemoved(DataSnapshot dataSnapshot) { }
        public void onChildMoved(DataSnapshot dataSnapshot, String s) { }
        public void onCancelled(DatabaseError databaseError) { }
        public void onChildChanged(DataSnapshot dataSnapshot, String s) {
            Log.e(TAG , "onChildChanged called");
        }
    };

【问题讨论】:

    标签: android firebase firebase-realtime-database


    【解决方案1】:

    没有与 SQL 的 WHERE id IN (1,2,3) 等效的 Firebase。

    在 Firebase 中,您必须单独检索每个项目。但这并不像你想象的那么慢,因为Firebase pipelines the requests

    【讨论】:

    • 好的,那么我将如何需要单独的侦听器来获取项目,然后按照特定顺序手动添加它,这不是很麻烦的过程吗?
    • 这是主观的,所以我不确定您在寻找什么。如果您编写代码但它不起作用,请发布minimum code that reproduces the problem。如果您有代码并想知道是否可以简化,您可能想在此处或在 codereview.stackexchange.com 上发布。
    猜你喜欢
    • 1970-01-01
    • 2017-08-03
    • 2018-10-29
    • 2020-08-15
    • 2021-12-22
    • 2017-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多