【问题标题】:Firebase Android - Retrieve data from two nodes of same object based on uniqueIDFirebase Android - 基于 uniqueID 从同一对象的两个节点检索数据
【发布时间】:2017-06-11 07:17:28
【问题描述】:

这是我的虚拟火力基地结构。

 { "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
                      }
                 }
        }

    }
}

我想同时从“节点 A”和“节点 B”中提取具有一些唯一 id 的数据(假设 id = 1234 & 0000)。 “节点 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 不允许我这样做。

更新 新的 sn-p:

  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。我现在没有得到任何结果。所有引用都是正确的。查询是正确的。我不明白为什么 sn-p 不检索数据。现在完全糊涂了。

【问题讨论】:

  • 在这种情况下 ValueEventListener 不适合使用。 ValueEventListener.onDataChange() 总是在某个数据库引用上被调用一次并且最后一次。您最好通过 ChildEventListener 检索您的数据。 stackoverflow.com/questions/34530566/…
  • @Taras 我也试过childEventListener。但它不起作用。代码有什么问题?

标签: android firebase-realtime-database


【解决方案1】:

您的快照包含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")));
        }
    }
});

请配置您的过滤条件,一切顺利!

【讨论】:

  • 我的 firebase 数据包含自定义类对象“Restaurant”。它有几个变量,“id”唯一标识了 Restaurant 类型的对象。据我了解,您正在从 Hashmap 中检索 ID 的值。但这不是我的要求。假设我有几个 ID,并使用这些 ID 从 firebase 检索数据。主要问题是这些 ID 可能位于任何节点或两者中。例如:(来自快照)如果我有 3 个 ID - 123467890000。现在我想用这些 ID 检索相应节点的数据。如果您需要更多信息,请告诉我。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多