web-dev-qa-db-fra.com

Comment récupérer un noeud spécifique de la base de données Firebase sous Android

J'essaie d'utiliser Firebase dans mon application Android. Je suis la documentation de Sauvegarde et récupération , Mais la base de données Sample (Dragon) utilisée dans le tutoriel a une structure différente de celle de ma base de données.

Ceci est mon code pour pousser les données à 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);

qui créent un format de base de données comme celui-ci

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

Je souhaite récupérer des données à partir de Firebase, de sorte que, si je mets "Nom complet" dans la zone de recherche de mes applications, il doit récupérer ce nœud spécifique afin que je puisse renseigner ces informations dans Listview.

Voici comment j'essaye de récupérer,

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

                    }

mais il retourne tous les nœuds,

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

Comment puis-je récupérer un nœud spécifique de sorte que si j'entre fullName = mast, il ne doit récupérer que le deuxième nœud avec tous les champs de ce nœud.

15
gooner

Vous créez une requête dans cette ligne:

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

Ainsi, la requête ordonne aux nœuds enfants leur valeur fullName. Mais cela ne limite pas encore le nombre de nœuds enfants retournés.

Pour limiter les nœuds, vous devez également filtrer. par exemple.:

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

Vous pouvez également obtenir une plage de nœuds en filtrant avec startAt et/ou endAt au lieu de equalTo.

Comme Kato a commenté:

Il semble qu'il y ait un nombre d'enfants superflus. Les données sont structurées en saving-data/fireblog/<record id>/fluff/...actual data... et la couche de peluches doit être supprimée pour que ces requêtes fonctionnent. Vous ne pouvez pas interroger des enfants d'enfants.

22
Frank van Puffelen

C'est un autre moyen de récupérer une valeur unique de la base de données firebase à l'aide de Hashmap.

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

                }
            });
0
viral 9966

Que diriez-vous si nous voulons ajouter plus de nœuds sous la même clé à partir de laquelle nous venons de récupérer des données? Par exemple: 

"Android" :{

        "saving-data" : {
          "fireblog" : {
            "-JiRtkpIFLVFNgmNBpMj" : {
              "Name" : {
                "birthDate" : "100",
                "fullName" : "Name",
                "healthCond" : "fyhft",
                "mob1" : "5855",
                "mob2" : "5858",
                "socialNumber" : "100"
"More Info" : {

                "status" : "100",
                "gender" : "Name",
                "gfg" : "fyhft",
                "fgfg" : "5855",
                "fgf" : "5858",
                "fgf" : "100"
              }
0
Ahmed Imam