如何在jsonarray firebase android中获取对象?

时间:2017-12-06 04:27:00

标签: android json firebase firebase-realtime-database

Firebase数据结构

Structure Firebase data

DetailItemOrderSetGet

我想获取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) {

        }
    });

2 个答案:

答案 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);