【问题标题】:How to retrieve specific node from firebase database in android如何从android中的firebase数据库中检索特定节点
【发布时间】:2015-02-19 08:32:43
【问题描述】:

我正在尝试在我的 android 应用程序中使用 Firebase。我正在关注Savingretrieving 的文档, 但是教程中使用的示例数据库(Dragon)与我的数据库具有不同的结构。

这是我将数据推送到 firebase 的代码

Firebase myFirebaseRef = new Firebase("https://myfirebaseurl.firebaseio.com/android/saving-data/fireblog");
                User userName = new User(socialNum, name, datofBirth, mob1, mob2, healthCondition);
                Firebase usersRef = myFirebaseRef.child(name);
                Map<String, User> users = new HashMap<String, User>();
                users.put(name, userName);                    
              myFirebaseRef.push().setValue(users);

像这样创建数据库格式

{
      "android" : {
        "saving-data" : {
          "fireblog" : {
            "-JiRtkpIFLVFNgmNBpMj" : {
              "Name" : {
                "birthDate" : "100",
                "fullName" : "Name",
                "healthCond" : "fyhft",
                "mob1" : "5855",
                "mob2" : "5858",
                "socialNumber" : "100"
              }
            },
            "-JiRv0RmHwWVHSOiZXiN" : {
              "mast" : {
                "birthDate" : "100",
                "fullName" : "mast",
                "healthCond" : "fyhft",
                "mob1" : "5855",
                "mob2" : "5858",
                "socialNumber" : "100"
              }
            }
          }
        }
      }
    }

我想从 firebase 检索数据,这样,如果我在我的应用搜索框中输入“全名”,它应该检索该特定节点,以便我可以在 Listview 中填充该信息。

这就是我试图检索的方式,

final String Find = find.getText().toString();   //Get text for search edit text box
                Firebase myFirebaseRef = new Firebase("https://myfirebaseurl.firebaseio.com/android/saving-data/fireblog");
                Query queryRef = myFirebaseRef.orderByChild("fullName");
               // System.out.println(dataSnapshot.getKey() + "is" + value.get("socialNumber"));
                System.out.println(Find);

                queryRef.addChildEventListener(new ChildEventListener() {
                    @Override
                    public void onChildAdded(DataSnapshot dataSnapshot, String previousChild) {
                        System.out.println(dataSnapshot.getValue());
                        Map<String,Object> value = (Map<String, Object>) dataSnapshot.getValue();

                        String name1 = String.valueOf(value.get("fullName"));
                    //System.out.println(dataSnapshot.getKey() + "is" + value.get("fullName").toString());
                    if (name1.equals(Find)){
                        System.out.println("Name" + value.get("fullName"));
                    }
                    else{
                        System.out.println("its is null");
                    }

                    }

但它返回所有节点,

02-19 12:18:02.053    8269-8269/com.example.nilesh.firebasetest I/System.out﹕ name
02-19 12:18:05.426    8269-8269/com.example.nilesh.firebasetest I/System.out﹕ {Name={socialNumber=100, birthDate=100, fullName=Name, mob1=5855, mob2=5858, healthCond=fyhft}}
02-19 12:18:05.426    8269-8269/com.example.nilesh.firebasetest I/System.out﹕ its is null
02-19 12:18:05.426    8269-8269/com.example.nilesh.firebasetest I/System.out﹕ {mast={socialNumber=100, birthDate=100, fullName=mast, mob1=5855, mob2=5858, healthCond=fyhft}}
02-19 12:18:05.426    8269-8269/com.example.nilesh.firebasetest I/System.out﹕ its is null

我如何检索特定节点,以便如果我输入 fullName = mast,它应该只检索具有该节点中所有字段的第二个节点。

【问题讨论】:

  • 看来孩子的水平是多余的。数据的结构为saving-data/fireblog/&lt;record id&gt;/fluff/...actual data...,需要删除fluff 层才能使这些查询正常工作。您不能查询子项的子项。
  • @Kato ,是的,我注意到了这一点并修改了我的推送代码。查询现在有效。但是现在我在 If(Data not found ) 条件下面临的另一个问题。由于此查询一一遍历所有节点,我无法让 else{} 语句 中的代码正常工作。我考虑使用'queryRef.addListenerForSingleValueEvent',但查询返回所有节点
  • 这听起来像是一个答案@kato。 :-)
  • @FrankvanPuffelen 随时在您的答案中添加注释,因为任何访问该问题的人都会引用该注释。
  • @FrankvanPuffelen,我有疑问。为什么相同的查询 (Query queryRef = myFirebaseRef.orderByChild("fullName").equalTo("gooner");) 在 queryRef.addChildEventListener()queryRef.addListenerForSingleValueEvent() ?第一个返回单个特定节点,第二个返回所有节点。

标签: android firebase firebase-realtime-database


【解决方案1】:

您正在此行中创建查询:

Query queryRef = myFirebaseRef.orderByChild("fullName");

就像查询按子节点的fullName 值对它们进行排序一样。但它还没有限制返回的子节点。

要限制节点,您还必须进行过滤。例如:

Query queryRef = myFirebaseRef.orderByChild("fullName").equalTo("gooner");

您还可以通过使用startAt 和/或endAt 而不是equalTo 过滤来获得一系列节点。

正如加藤所说:

看起来孩子的水平是多余的。数据结构为saving-data/fireblog/&lt;record id&gt;/fluff/...actual data..。并且需要删除绒毛层才能使这些查询起作用。您不能查询子项的子项。

【讨论】:

  • 感谢您的回复。我接受你的回答,但是@Kato 的评论对我很有帮助。你能帮我理解 queryRef.addListenerForSingleValueEvent()queryRef.addChildEventListener() 之间的区别吗?
  • @gooner 使用 Query for SingleValueEvent 将为该查询注册一个 ValueEvent 一次,当操作完成后,它将自动删除侦听器。 addChildEventListener,你注册一个 ChildEventListener,它将监听你正在查询的节点中每个子节点的变化
  • 如何检索所有具有相同值的节点。像所有蓝色油漆的房子一样
【解决方案2】:

如果你想像这样获取特定节点或子节点的值

如果要获取子节点(地址)值,请在此处。这样就可以搞定了

    FirebaseDatabase database;
    DatabaseReference myRef;
    myRef = database.getReference();
    final DatabaseReference orders_Reference = myRef.child("Order");


 orders_Reference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for (DataSnapshot data : dataSnapshot.getChildren()) {
                if(data.getKey().equals("address")){
                String orderNumber = data.getValue().toString();
                Log.d("Specific Node Value" , orderNumber);
               }
            }
        }
        @Override
        public void onCancelled(DatabaseError databaseError) {
        }
    });

【讨论】:

    【解决方案3】:

    这是另一种使用 Hashmap 从 firebase 数据库中检索单个值的方法。

         ArrayList<HashMap<String,String>> AllUserscourselist;
     String SelectedCourseUserUId;
         DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference();
    
         databaseReference.child("User_course_Details").addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
        //                        emergencyContactsList = new ArrayList<>();
                        AllUserscourselist = new ArrayList<HashMap<String, String>>();
                        if(dataSnapshot.exists())
                        {
                            for(DataSnapshot postSnapShot:dataSnapshot.getChildren())
                            {
    
                                for (DataSnapshot courseUID : postSnapShot.getChildren()){
                                    UsercourseDetails usercourseDetails = courseUID.getValue(UsercourseDetails.class);
                                    HashMap<String, String> map = new HashMap<String, String>();
    
                                    String user_id = postSnapShot.getKey();
                                    String course_id = usercourseDetails.getcourse_id();
                                    String course_type = usercourseDetails.getcourse_type();
                                    String course_brand = usercourseDetails.course_brand;
                                    String course_number_plate_url = usercourseDetails.course_number_plate_url;
    
                                    map.put("user_id", user_id);
                                    map.put("course_id", course_id);
                                    map.put("course_type", course_type);
                                    map.put("course_brand", course_brand);
                                    map.put("course_number_plate_url", course_number_plate_url);
    
                                    AllUserscourselist.add(map);
                                }
    
        //                        AllUserscourselist.add(new UsercourseDetails(usercourseDetails.getcourse_type(),usercourseDetails.getcourse_brand(),usercourseDetails.getcourse_number_plate_url(),usercourseDetails.getcourse_id()));
                            }
    
                            Log.e("AllUserscourselist",""+AllUserscourselist);
    
                            courseIdList = new ArrayList<String>();
                            for (int i = 0; i < AllUserscourselist.size(); i++) {
                                String course_id_list;
                                course_id_list = AllUserscourselist.get(i).get("course_id")+" "+ AllUserscourselist.get(i).get("user_id");
                                courseIdList.add(course_id_list);
                            }
    
                            if(courseIdList.size()>0 && courseIdList!=null) {
                                for (int i = 0; i < courseIdList.size(); i++) {   //used
                                    String arr[] = courseIdList.get(i).split(" ");
                                    if (arr[0].equals(coursenumber)) {
                                        SelectedcourseUserUId = arr[1];
                                        getUserEmergencyContacts(SelectedcourseUserUId);
                                        break;
                                    }
                                }
                            }
    
                        }else{
        //                    NavigationActivity.this.overridePendingTransition(R.anim.anim_slide_in_left, R.anim.anim_slide_in_left);
                        }
                    }
                    @Override
                    public void onCancelled(DatabaseError databaseError) {
    
                    }
                });
    

    【讨论】:

      【解决方案4】:

      不是获取所有节点然后迭代它以根据值获取节点, 只需触发firebase提供的查询即可。

         private void readAllRequestedFormFromFirebaseDb(){
          final FirebaseDatabase database = FirebaseDatabase.getInstance();
          DatabaseReference ref = database.getReference("App_DB");
          DatabaseReference childRef = ref.child("AllRequest");
          Query queryRef = 
        childRef.orderByChild("fullName").equalTo("Jay");
          queryRef.addListenerForSingleValueEvent(new ValueEventListener() {
              @Override
              public void onDataChange(@NonNull DataSnapshot snapshot) {
      
                  // getting list
                  for(DataSnapshot dataSnapshot: snapshot.getChildren()){
                      QueryFormModel post = dataSnapshot.getValue(QueryFormModel.class);
                      queryFormModelArrayList.add(post);
                      /*the above list will have record only
                       with the provided fullName as Jay*/
      
                  }
      
              }
              @Override
              public void onCancelled(@NonNull DatabaseError databaseError) {
                  Log.e("DetailsActivity", "onCancelled:readAllSubmittedRequestFromFirebaseDb:  "+databaseError );
              }
          });
      }
      

      Click here and find the beautifully written post about this topic

      【讨论】:

        猜你喜欢
        • 2019-02-07
        • 1970-01-01
        • 2019-07-13
        • 2021-12-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-15
        • 2018-10-04
        相关资源
        最近更新 更多