【发布时间】: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