Firebase数据结构
我想获取order_detail中的所有数据或order_detail中的一个数据,如detail_item_id。我总是得到错误强制关闭因为order_detail,但是如何为此循环或如何获取数组对象之一?我只能获得一个级别的数据,如order_customer_name或order_date。这是我的代码。感谢
mDatabase.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
processOrderList.clear();
for (DataSnapshot postSnapshot : dataSnapshot.getChildren()){
DetailitemOrderSetGet orderDetail = postSnapshot.child("order_detail").getValue(DetailitemOrderSetGet.class);
processOrderList.add(postSnapshot.getValue(OrderHistorySetGet.class));
}
processAdapter.notifyDataSetChanged();
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
答案 0 :(得分:0)
嗯,我不知道你的类 DetailitemOrderSetGet 的Setter getter是什么。但我会谈谈它的一般模式。不要把自己与Json对象和Json数组混淆。此Firebase数据返回采用Json格式,实现起来非常简单快速。
我将使用您的Json返回来讨论它的一般模式。
我能看到的第一件事是你的回归中的Json Array,即交易
首先得到它并存储它。一个实例看下面
JSONArray transactionsArray = myFirebaseReturnOBJECT.get("Transactions");
现在您已在transactionsArray中获得了数组。现在,您需要遍历它以获取所需的数据。
现在第二步是获取另一个也是JSONArray的数据段,因此我们必须执行相同的过程但是在for循环中,因为我们有TransactionsArray。
for (int i = 0; i<transactionsArray.length();i++){
JSONArray orderDetailsArray = jsonObject.getJSONArray("order_details");
for (int j = 0; j <orderDetailsArray.length() ; j++) {
JSONObject order_detail_OBJ = orderDetailsArray.getJSONObject(j);
String detail_item_id = order_detail_OBJ.getString("detail_item_id");
}
}
你可以看到我已经设法做2 for循环,因为有2个jsonArrays。所以在第2步中使用了循环并获得了索引“j”的JsonObject,并从JsonObject获得了 order_detail_OBJ 我已经成功获得了我想要的字段detail_item_id
我希望这可以帮助你获得你想要的东西。我刚刚把它作为例子,可能存在一些类型错误。
答案 1 :(得分:0)
您无需使用JSONArray
即可从Firebase数据库获取数据。您可以使用DataSnapshot
方法迭代getChildren()
对象。假设Transaction
节点是Firebase数据库根目录的直接子节点,并且您将detail_item_id
存储为int
,则从所有子节点获取detail_item_id
的值在order_detail
节点下,请使用以下代码:
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference orderDetailRef = rootRef.child("Transaction").child("4").child("order_detail");
ValueEventListener eventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot ds : dataSnapshot.getChildren()) {
int detail_item_id = ds.child("detail_item_id").getValue(Integer.class);
Log.d("TAG", detail_item_id);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {}
};
orderDetailRef.addListenerForSingleValueEvent(eventListener);