2016-07-25 5 views
0

So sieht der Knoten "foods" meiner Firebase-Datenbank auf der Firebase-Konsole aus, wobei der erste Knoten vollständig erweitert ist. Ich möchte durch die Daten gehen, um die ersten drei als Strings zu bekommen, die "Position" -Taste als Int und die "Venues" als Array oder ArrayList, idealerweise ohne auf jedes einzelne Element mit seinem Schlüssel Bezug zu nehmen (zB "KISbAUkPflh5JH_ig24"). Ich möchte das für jedes Element tun.Prozessdaten von mehreren Knoten unterschiedlicher Größe und Datentyp Firebase

-moods 
-KIsbAUkPflh5JH_ig24 
     icon: "http://www.imagesource.com/0" 
     image: "http://www.imagesource.com/1" 
     name: "Happy" 
     position: 1 
-venues 
     100: true 
     262: true 
     45: false 
     68: false 
     82: true 
+KIxKyLALCKFV67azkK7 
+KIxL-z474lwJ2aR86NU 
+KIxQQOow2pVeMeqVpL1 
+KIxU-Umxac4aG_swuNt 

Bisher habe ich versucht

public void onDataChange(DataSnapshot dataSnapshot) { 
      // This method is called once with the initial value and again 
      // whenever data at this location is updated. 

    Log.d(TAG, dataSnapshot.toString()); 
    Log.d(TAG, "ChildrenCount == " + dataSnapshot.getChildrenCount()); 
    for(DataSnapshot d : dataSnapshot.getChildren()) 
    { 
     Log.d(TAG, d.getKey() + " : " + d.getValue(String.class)); 
    } 
    dataSnapshot.getValue(ArrayList.class); 
} 

Welche druckt:

(FULL JSON DOCUMENT ON THIS LINE) 

ChildrenCount == 5 

icon : http://www.imagesource.com/0 

image : http://www.imagesource.com/1 

name : Happy 

D/AndroidRuntime: Shutting down VM 

E/UncaughtException: com.google.firebase.database.DatabaseException: Failed to >convert value of type java.lang.Long to String 

Wie würde ich mich über diese Daten Parsen in es verschiedene Typen gibt, ohne explizit unter Angabe der Datentyp suche ich von jedem Knoten? Ist das möglich oder sollte ich einfach eine große switch-Aussage machen und jeden Gegenstand mit seinem Schlüssel behandeln?

+0

ich denke, es sollte Log.d (TAG, d.getKey() + sein ":" + d.getValue() .toString()); weil Ihre Zeile eine lange in eine Zeichenfolge konvertiert, die Ihnen den Fehler gibt. –

+0

Ihre Datenstruktur ist nicht klar. Fügen Sie den tatsächlichen JSON als Text ein, den Sie erhalten, indem Sie in der Firebase-Konsole auf die Schaltfläche zum Exportieren klicken. –

Antwort

0

Die Lösung war ich fand eine große switch-Anweisung wie folgt zu machen:

public void onDataChange(DataSnapshot dataSnapshot) { 
     // This method is called once with the initial value and again 
     // whenever data at this locations is updated. 

     int childCount = (int)dataSnapshot.getChildrenCount(); 

     final String [] icons = new String[childCount]; 
     final String [] images = new String[childCount]; 
     /*final String []*/ moodNames = new String[childCount]; 
     final Bitmap [] backgroundBitmaps = new Bitmap[childCount]; 
     venueKeysInEachButton = new String[childCount][]; 
     int moodCounter = 0; 

     //For each mood in moods 
     for(DataSnapshot mood : dataSnapshot.getChildren()) { 

      //Get all of the information about the mood 
      String icon = ""; 
      String image = ""; 
      String moodName = ""; 
      int position = 0; 

      for (DataSnapshot moodChild : mood.getChildren()) { 

       String key = moodChild.getKey(); 
       switch (key) { 
        case "icon": 
         icon = moodChild.getValue(String.class); 
         Log.i(TAG, key + " : " + icon); 
         break; 
        case "image": 
         image = moodChild.getValue(String.class); 
         Log.i(TAG, key + " : " + image); 
         break; 
        case "name": 
         moodName = moodChild.getValue(String.class); 
         Log.i(TAG, key + " : " + moodName); 
         break; 
        case "position": 
         position = moodChild.getValue(Long.class).intValue() - 1; 
         Log.i(TAG, key + " : " + position); 
         break; 
        case "venues": 

         Log.i(TAG, key + " : " + moodChild.getValue().toString()); 

         ArrayList<String> venueKeys = new ArrayList<String>(); 
         Iterable<DataSnapshot> venueSnapshot = moodChild.getChildren(); 
         for (DataSnapshot venue : venueSnapshot){ 
          Log.d(TAG, venue.toString()); 
          if(venue.getValue(Boolean.class)){ 
           venueKeys.add(venue.getKey()); 
          } 
         } 

         venueKeysInEachButton[moodCounter] = new String [venueKeys.size()]; 
         venueKeys.toArray(venueKeysInEachButton[moodCounter]); 
         break; 
        default: 
         Log.e(TAG, "Error when parsing DataSnapshot, key is : " + key); 
         break; 
       } 
      } 

      icons[position] = icon; 
      images[position] = image; 
      moodNames[position] = moodName; 
      moodCounter++; 

     } 
    } 
Verwandte Themen