当前位置: 首页 > 知识库问答 >
问题:

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

曾奇略
2023-03-14

这是我的假火基地结构。

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

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

        }
    });

更新新代码段:

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

共有1个答案

施德运
2023-03-14

快照包含hashmap对象。节点A和节点B将被表示为具有相应值(Object)的键。看一看具有类似您的数据结构的示例。

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")));
                }
            }

请配置您的筛选条件,您就可以开始了!

 类似资料:
  • 我想编写一个Java类,根据相关的时间戳计算一些规则(对于每个rueleId)的出现次数。 例如 输入: 输出: 我想我可以利用HashMap。 我认为这里的键是基于ruleId(type:String)和timestamp(type:Calendar)的,值是计数。 我怎样才能拥有基于两个不同对象的密钥?我的方法错了吗?

  • 我有三节课: 人类 父亲 孩子。 儿童阶级延伸父亲,父亲延伸人类。 我已经创建了每个类的一些实例并将它们存储到ArrayList中。 现在,我想编写一个方法来检查对象father1是否与对象child1地址字段(类Father和Child的实例)具有相同的字段地址(例如:“21 str Goodwin”),并将此方法提供给我的ArrayList,如果发现任何结果,则打印。 我怎么能这样呢? 为了更

  • 我有两个数组: 阵列 1: 和阵列 2: 我需要根据合并这两个数组并得到这个: 不通过< code>Object.keys进行迭代,我如何做到这一点?

  • 和我的数据库的结构: 正如您所看到的,“pasos”是一个字符串列表,而“成分”是一个成分列表。 我无法找到的是如何从数据库中检索这些列表,因为我想获得一个接收列表。我尝试了很多事情,但都是错误的,因为它没有检索到任何列表。 我还知道FB DB可以使用HashMaps,但我不知道如何检索它们或从hashmap传递到列表,而不必遍历hashmap每个位置 那我该怎么办呢?提前谢谢你

  • 我是Xpath的新手。 假设我有一个xml目录可以将商品导入电子商店: 目录的第一部分是商品类别列表,第二部分是商品列表。每种商品都有一个<代码> 从上面的代码中,我需要得到这样一个好的描述:类别:夹克;标签:D 标签、颜色和尺寸可直接从<代码> 所以我的目标是选择

  • 问题内容: 所以,我有一个 基于Java的Web项目 ,从3个独立的服务检索到的信息显示,托管在不同的服务器上,我使用 的Apache HTTP客户端 来获取通过在REST API信息 JSON ,使用 GSON库 。我将Json转换为用于显示信息的POJO。 现在,我想在项目中实现搜索功能,因此我将Solr安装在单独的服务器上,我想要的是: 为所有3个服务在solr服务器中索引JSON。 从So