Firebase Android - 基于uniqueID从同一对象的两个节点检索数据

时间:2017-01-25 22:34:23

标签: android firebase-realtime-database

这是我的虚拟火力架结构。

 { "Restaurant":{
    pushId: {
            "Node A":{
                    0:{ id = 1234
                        // data of some object type
                      }
                    1:{ id = 2345
                      // data of some object type
                      }
                    2:{ id = 3456
                      // data of some object type
                      }
                 }
            "Node B":{
                    0:{ id = 6789
                        // data of some object type
                      }
                    1:{ id = 9876
                      // data of some object type
                      }
                    2:{ id = 0000
                      // data of some object type
                      }
                 }
        }

    }
}

我想用一些唯一的id(假设id = 1234& 0000)同时从“节点A”和“节点B”中提取数据。 “节点A”和“节点B”包含相同类型的对象。我尝试了所有的信息,但可以让它发挥作用。

我附上了我写过的代码。以下代码用于实际数据。

ref.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for (DataSnapshot dataSnapshotChildren : dataSnapshot.getChildren()) {
                final DatabaseReference reference = dataSnapshotChildren.child(pref.getString("user_uid", null)).getRef();
                for (int j = 0; j < stringArray.length; j++) {
                    Log.d("res_details activity", "stringArray: " + stringArray[j]);
                    reference.orderByChild("id").equalTo(stringArray[j]).addListenerForSingleValueEvent(new ValueEventListener() {
                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot) {
                            Log.d("res_details activity", "dataSnapshot: " + dataSnapshot.getValue());
                            for (DataSnapshot singleSnapshot : dataSnapshot.getChildren()) {
                                Restaurant restaurant = singleSnapshot.getValue(Restaurant.class);
                                Log.d("res_details activity", "restaurant: " + restaurant);
                                restaurantArrayList.add(restaurant);
                            }
                            Log.d("res_details activity", "restaurantArrayList: " + restaurantArrayList.size());
                            setValue(restaurantArrayList);
                        }

                        @Override
                        public void onCancelled(DatabaseError databaseError) {

                            Log.d("res_details activity", "databaseError: " + databaseError);

                        }
                    });

                }
            }

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

所有数据库引用都是正确的。我已经检查了日志声明。上面的代码一次只给我一个结果。请帮我修改一下这段代码吧。提前致谢。任何建议都表示赞赏。

P.S - 我无法附上我的真实firebase结构的截图,因为stackoverflow不会让我。

更新 新摘要:

  ref.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
            Log.d("res_details activity", "s: " + s);
            for (DataSnapshot dataSnapshotChildren : dataSnapshot.getChildren()) {

                for (int j = 0; j < stringArray.length; j++) {
                    Log.d("res_details activity", "reference: " + dataSnapshotChildren.getRef().toString());
                    Log.d("res_details activity", "stringArray: " + stringArray[j]);
                    databaseReference.orderByChild("id").equalTo(stringArray[j]).addChildEventListener(new ChildEventListener() {
                        @Override
                        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                            Log.d("res_details activity", "dataSnapshot: " + dataSnapshot.getValue());
                            for (DataSnapshot singleSnapshot : dataSnapshot.getChildren()) {
                                Restaurant restaurant = singleSnapshot.getValue(Restaurant.class);
                                Log.d("res_details activity", "restaurant: " + restaurant);
                                restaurantArrayList.add(restaurant);
                            }
                            Log.d("res_details activity", "restaurantArrayList: " + restaurantArrayList.size());
                            setValue(restaurantArrayList);
                        }


                        @Override
                        public void onChildChanged(DataSnapshot dataSnapshot, String s) {

                        }
....

我也试过了childEventListener。现在它甚至没有触发嵌套childEventListener。我现在没有得到任何结果。所有引用都是正确的。查询是正确的。我不明白为什么片段不检索数据。现在完全混淆了。

1 个答案:

答案 0 :(得分:0)

您的快照包含HashMap个对象。节点A和节点B将被表示为具有对应值(对象)的键。看一下像你这样的数据结构的例子。

ref.addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                for (DataSnapshot snapshot : dataSnapshot.getChildren()){
                    HashMap<String, Long> m = (HashMap<String, Long>) snapshot.getValue();
                    Log.d("test", String.valueOf(m.get("id")));
                }
            }

请配置您的过滤条件,您就可以开始使用了!