2015-02-19 3 views
15

abrufen Ich versuche Firebase in meiner Android-Anwendung zu verwenden. Ich befolge die Dokumentation für Saving und retrieving, Aber die Beispieldatenbank (Dragon), die im Tutorial verwendet wird, hat eine andere Struktur als meine Datenbank.Wie bestimmte Knoten aus Firebase-Datenbank in Android

Dies ist mein Code, um die Daten für Pushing zu Feuerbasis

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

das Datenbankformat wie diese

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

Ich mag erstellen um Daten von der Feuerbasis, so dass, wenn ich „vollständigen Namen setzen "In meinem Apps-Suchfeld sollte es diesen bestimmten Knoten abrufen, damit ich diese Informationen in Listview auffüllen kann. Diese

ist, wie ich versuche, abzurufen

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

        } 

aber es gibt alle Knoten,

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 

Wie kann ich bestimmte Knoten abrufen, so dass, wenn ich eingeben fullname = Mast, es sollte nur den zweiten Knoten mit allen Feldern in diesem Knoten abrufen.

+5

Es scheint, als gäbe es eine überflüssige Anzahl von Kindern. Die Daten sind wie folgt strukturiert: 'saving-data/fireblog/ /fluff/...actual data ...' und die 'flaum'-Ebene muss entfernt werden, damit diese Abfragen funktionieren. Sie können Kinder von Kindern nicht abfragen. – Kato

+0

@Kato, Ja, das habe ich bemerkt und meinen Push-Code geändert. Die Abfrage funktioniert jetzt. Aber jetzt ein anderes Problem, ich stehe jetzt in * Wenn (Daten nicht gefunden) * Bedingung. Da diese Abfrage nacheinander alle Knoten durchläuft, kann mein Code in * else {} statement * nicht funktionieren. Ich überlegte, 'queryRef' zu verwenden.addListenerForSingleValueEvent 'aber dann Abfrage gibt alle Knoten zurück – gooner

+0

Das klingt wie eine Antwort @kato. :-) –

Antwort

21

Sie erstellen eine Abfrage in dieser Zeile:

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

Wie, dass die Abfrage der untergeordneten Knoten durch ihren fullName Wert bestellt. Es beschränkt jedoch noch nicht, welche Child-Knoten zurückgegeben werden.

Um die Knoten zu begrenzen, müssen Sie auch filtern. z.B .:

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

Sie auch eine Reihe von Knoten, durch Filterung mit startAt und/oder endAt statt equalTo bekommen kann.

Als Kato kommentiert:

Es sieht aus wie eine überflüssige Ebene von Kindern. Die Daten sind als saving-data/fireblog/<record id>/fluff/...actual data.. strukturiert. und die Flusenschicht muss entfernt werden, damit diese Abfragen funktionieren. Sie können Kinder von Kindern nicht abfragen.

+0

Danke für die Antwort. Ich akzeptiere deine Antwort, aber @Katos Kommentar war sehr hilfreich für mich. Kannst du mir bitte helfen, den Unterschied zwischen * queryRef.addListenerForSingleValueEvent() * und * queryRef.addChildEventListener() * mit dem besten Anwendungsfallszenario zu verstehen? – gooner

+0

@gooner, das die Abfrage für SingleValueEvent verwendet, registriert einmal ein ValueEvent für diese Abfrage, und wenn die Operation abgeschlossen ist, wird der Listener automatisch entfernt. Mit dem addChildEventListener registrieren Sie einen ChildEventListener, der auf Änderungen in jedem der untergeordneten Knoten in dem von Ihnen abgefragten Knoten wartet. – realdm

+0

hey ... kann ich Hilfe zu einem anderen Firebase-Problem erhalten: http://stackoverflow.com/q/42460780/6144372 –

0

Wie wäre es, wenn wir mehr Knoten unter dem gleichen Schlüssel hinzufügen möchten, von dem wir gerade Daten abgerufen haben? Beispiel:

"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

Es bedeutet, dass wir zwei Knoten unter dem eindeutigen Schlüssel haben, wie wir Daten zum Schlüssel dieses spezifischen Kindes holen und addieren ?? –

0

Dies ist eine andere Möglichkeit zum Abrufen einzelner Werte aus der Firebase-Datenbank mithilfe von 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) { 

       } 
      }); 
Verwandte Themen