Wie bekomme ich alle Kinderlisten von Firebase Android

73

Ich möchte alle Kinderliste von Firebase in Android.

Ich habe diesen Code implementiert, aber er funktioniert nicht.

mFirebaseRef = new Firebase(FIREBASE_URL);

mFirebaseRef.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        List<String> td = (ArrayList<String>) dataSnapshot.getValue();
        //notifyDataSetChanged();
    }

    @Override
    public void onCancelled(FirebaseError firebaseError) {

    }
});
Parth Vyas
quelle
Mögliches Duplikat: stackoverflow.com/questions/27848313/…
Dhwanik Gandhi
2
Antworte unten. Aber es ist teilweise eine Vermutung, weil "es funktioniert nicht" unglaublich vage ist und Sie keinen Ausschnitt Ihrer Daten einschließen. Wenn meine Antwort Ihr Problem nicht anspricht: Welchen Fehler erhalten Sie? Wie sehen Ihre Daten aus (ein Beispiel zum Kopieren / Einfügen, keine Screenshots und keine Beschreibungen)?
Frank van Puffelen
Versuchen Sie dies: stackoverflow.com/questions/32886546/…
ugali soft

Antworten:

97

Ich hoffe unten Code funktioniert

Firebase ref = new Firebase(FIREBASE_URL);

  ref.addValueEventListener(new ValueEventListener() {
      @Override
      public void onDataChange(DataSnapshot snapshot) {
          Log.e("Count " ,""+snapshot.getChildrenCount());
          for (DataSnapshot postSnapshot: snapshot.getChildren()) {
            <YourClass> post = postSnapshot.getValue(<YourClass>.class);
            Log.e("Get Data", post.<YourMethod>());
          }
      }
      @Override
      public void onCancelled(FirebaseError firebaseError) {
          Log.e("The read failed: " ,firebaseError.getMessage());
      }
  });
Nilesh Senta
quelle
5
Wenn ich das Protokoll drucke, ist es null. Kannst du mir helfen?
Rethinavel
5
Vergessen Sie nicht , zu verwenden , addListenerForSingleValueEvent()statt , addValueEventListener()wenn Sie nur die Daten einmal benötigen.
Sebastian
35

Firebase speichert eine Folge von Werten in diesem Format:

"-K-Y_Rhyxy9kfzIWw7Jq": "Value 1"
"-K-Y_RqDV_zbNLPJYnOA": "Value 2"
"-K-Y_SBoKvx6gAabUPDK": "Value 3"

Wenn Sie sie so haben, erhalten Sie den falschen Typ. Die obige Struktur wird als Map: nicht dargestellt als List:

mFirebaseRef = new Firebase(FIREBASE_URL);

mFirebaseRef.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        Map<String, Object> td = (HashMap<String,Object>) dataSnapshot.getValue();

        List<Object> values = td.values();

        //notifyDataSetChanged();
    }

    @Override
    public void onCancelled(FirebaseError firebaseError) {

    }
});
Frank van Puffelen
quelle
Ich möchte eine übergeordnete Liste von "-K-Y_Rhyxy9kfzIWw7Jq": "Wert 1" -K-Y_RqDV_zbNLPJYnOA ":" Wert 2 "-K-Y_SBoKvx6gAabUPDK": "Wert 3"
Parth Vyas
Ist das Map<String, MyDataObject> = (HashMap<String, MyDataObject>) dataSnapshot.getValue();in Ordnung oder muss ich Object in MyDataObject konvertieren?
Vinay Nagaraj
@Frank, Android Studio zeigt in dieser Zeile eine rote Unterstreichung. List <Object> values ​​= td.values ​​(); ... FEHLER: - Das Auflistungsobjekt kann nicht in ein Listenobjekt umgewandelt werden. Fehler in Stacktrace auslösen.
Narendra Baratam
@ Frank Danke, List<Object> values = td.values();ist sehr schön zu wissen.
Mtl Dev
8
@ NarendraBaratam Ich hatte das gleiche Problem. Verwenden Sie stattdessen diese Methode:List<Object> values = new Arraylist<>(td.values());
Hesam
27
FirebaseDatabase mFirebaseDatabase = FirebaseDatabase.getInstance();
 DatabaseReference databaseReference =    mFirebaseDatabase.getReference(FIREBASE_URL);
        databaseReference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {

                for (DataSnapshot childDataSnapshot : dataSnapshot.getChildren()) {
                    Log.v(TAG,""+ childDataSnapshot.getKey()); //displays the key for the node
                    Log.v(TAG,""+ childDataSnapshot.child(--ENTER THE KEY NAME eg. firstname or email etc.--).getValue());   //gives the value for given keyname
                }
            }
        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

Ich hoffe es hilft!

Pramod Garg
quelle
13

Wie Frank sagte, speichert Firebase eine Folge von Werten, in deren Format "key": "Value" eine Kartenstruktur vorliegt

Um List aus dieser Sequenz zu erhalten, müssen Sie

  1. Initialisieren Sie GenericTypeIndicator mit HashMap von String und Ihrem Objekt .
  2. Ruft den Wert von DataSnapShot als GenericTypeIndicator in Map ab .
  3. Initialisieren Sie ArrayList mit HashMap- Werten.

GenericTypeIndicator<HashMap<String, Object>> objectsGTypeInd = new GenericTypeIndicator<HashMap<String, Object>>() {};
Map<String, Object> objectHashMap = dataSnapShot.getValue(objectsGTypeInd);
ArrayList<Object> objectArrayList = new ArrayList<Object>(objectHashMap.values());

Funktioniert gut für mich, hoffe es hilft.

Mamdouh El Nakeeb
quelle
2
Fand dieses begraben in der doco firebase.com/docs/java-api/javadoc/com/firebase/client/...
angryITguy
10

Ich habe so etwas gemacht:

Firebase ref = new Firebase(FIREBASE_URL);
ref.addValueEventListener(new ValueEventListener() {

@Override
public void onDataChange(DataSnapshot snapshot) {
    Map<String, Object> objectMap = (HashMap<String, Object>)    
             dataSnapshot.getValue();
    List<Match> = new ArrayList<Match>();
    for (Object obj : objectMap.values()) {
        if (obj instanceof Map) {
            Map<String, Object> mapObj = (Map<String, Object>) obj;
            Match match = new Match();
            match.setSport((String) mapObj.get(Constants.SPORT));
            match.setPlayingWith((String) mapObj.get(Constants.PLAYER));
            list.add(match);
        }
    }
  }
  @Override
  public void onCancelled(FirebaseError firebaseError) {

  }
});
Ruchita
quelle
1
Verstehe ich richtig? Sie wiederholen jedes Mal, wenn Sie nur einen Wert vom Typ Match hinzufügen?
MeLine
6

In meinem Fall hat nur die gegebene Lösung gut funktioniert.

Screenshot der Firebase ArrayList-Struktur :

Geben Sie hier die Bildbeschreibung ein

So rufen Sie eine ganze Liste aus Firebase aus DataSnapshot ab .

GenericTypeIndicator<Map<String, List<Education>>> genericTypeIndicator = new GenericTypeIndicator<Map<String, List<Education>>>() {};
Map<String, List<Education>> hashMap = dataSnapshot.getValue(genericTypeIndicator);

for (Map.Entry<String,List<Education>> entry : hashMap.entrySet()) {
      List<Education> educations = entry.getValue();
        for (Education education: educations){
             Log.i(TAG, education.Degree);
         }
}

Education.java: (Modellklasse).

public class Education implements Serializable{

    public String Degree;
    public String Result;
}

Hoffe das würde gut funktionieren.

Hiren Patel
quelle
6
    @Override
       public void onDataChange(DataSnapshot dataSnapshot) {
           for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) {
               User user = postSnapshot.getValue(User.class);
               list.add(user);
           }
           for (int i=0;i<list.size();i++)
           {
               Log.e("Name",list.get(i).getname());
               Log.e("Phone",list.get(i).getphone());

           }
       }
       @Override
       public void onCancelled(FirebaseError firebaseError) {
       Log.e("error",firebaseError.getMessage());
       }
   });

Klassenmodell

class User{

String name;

String phone;

public String getname() {
    return name;
}

public void setname(String name) {
    this.name = name;
}


public String getphone() {
    return phone;
}

public void setphone(String phone) {
    this.phone = phone;
}
}

Listenbindung

List<User> list= new ArrayList <>();

diese Arbeit für Sie

Frankenstein
quelle
5

Speichern und erneutes Abrufen von Daten in - von Firebase (veraltete Version 2.4.2)

Firebase fb_parent = new Firebase("YOUR-FIREBASE-URL/");
Firebase fb_to_read = fb_parent.child("students/names");
Firebase fb_put_child = fb_to_read.push(); // REMEMBER THIS FOR PUSH METHOD

//INSERT DATA TO STUDENT - NAMES  I Use Push Method
fb_put_child.setValue("Zacharia"); //OR fb_put_child.setValue(YOUR MODEL) 
fb_put_child.setValue("Joseph"); //OR fb_put_child.setValue(YOUR MODEL) 
fb_put_child.setValue("bla blaaa"); //OR fb_put_child.setValue(YOUR MODEL) 

//GET DATA FROM FIREBASE INTO ARRAYLIST
fb_to_read.addValuesEventListener....{
    public void onDataChange(DataSnapshot result){
        List<String> lst = new ArrayList<String>(); // Result will be holded Here
        for(DataSnapshot dsp : result.getChildren()){
            lst.add(String.valueOf(dsp.getKey())); //add result into array list
        }
        //NOW YOU HAVE ARRAYLIST WHICH HOLD RESULTS




for(String data:lst){ 
         Toast.make(context,data,Toast.LONG_LENGTH).show; 
       }
    }
}
ugali weich
quelle
4

Wenn Sie Kotlin verwenden, ist der nächste eine gute Lösung:

myRef.addListenerForSingleValueEvent(object : ValueEventListener {
  override fun onDataChange(dataSnapshot: DataSnapshot) {
      val list = dataSnapshot.children.map { it.getValue(YourClass::class.java)!! }
      Log.d("TAG", "Value is: $list")
}
David Mendaño
quelle
3

Klappt wunderbar

final DatabaseReference senderDb = FirebaseDatabase.getInstance().getReference(Constant.NODE_MESSAGE).child(myId + "_" + otherId);

    senderDb.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            Map<String, Object> td = (HashMap<String,Object>) dataSnapshot.getValue();

            for (DataSnapshot childDataSnapshot : dataSnapshot.getChildren()) {
                DatabaseReference objRef = senderDb.child( childDataSnapshot.getKey());
                Map<String,Object> taskMap = new HashMap<String,Object>();
                taskMap.put("is_read", "1");
                objRef.updateChildren(taskMap); //should I use setValue()...?
                Log.v("Testing",""+ childDataSnapshot.getKey()); //displays the key for the node
            }

            //notifyDataSetChanged();
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }

    });
Arun Prajapati
quelle
1
mDatabase.child("token").addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
              for (DataSnapshot snapshot:dataSnapshot.getChildren())
              {
                 String key= snapshot.getKey();
                 String value=snapshot.getValue().toString();
              }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {
                Toast.makeText(ListUser.this,databaseError.toString(),Toast.LENGTH_SHORT).show();
            }
        });

Nur arbeiten, wenn das Kind keine hat SubChild

Geben Sie hier die Bildbeschreibung ein

dsc clg
quelle
0

Sie müssen einen benutzerdefinierten Deserializer schreiben, ihn dann schleifen und die Werte der Hashmap abrufen.

Benutzerdefinierter Deserializer: -

public class UserDetailsDeserializer implements JsonDeserializer<AllUserDetailsKeyModel> {
  /*
    bebebejunskjd:{
      "email": "[email protected]",
          "mobileNum": "12345678",
          "password": "1234567",
          "username": "akhil"}*/
  @Override public AllUserDetailsKeyModel deserialize(JsonElement json, Type typeOfT,
      JsonDeserializationContext context) throws JsonParseException {

    final JsonObject jsonObject = json.getAsJsonObject();

    Gson gson = new Gson();

    Type AllUserDetailsResponseModel =
        new TypeToken<HashMap<String, AllUserDetailsResponseModel>>(){}.getType();

    HashMap<String, AllUserDetailsResponseModel> user =
        gson.fromJson(jsonObject, AllUserDetailsResponseModel);
    AllUserDetailsKeyModel result = new AllUserDetailsKeyModel();
    result.setResult(user);
    return result;
  }


}

Der Code in den Kommentaren ist mein Objektmodell und Sie sollten AllUserDetailsKeyModel durch Ihre Modellklasse ersetzen und diesen wie folgt zum Restclient hinzufügen: -

private Converter.Factory createGsonConverter() {
    GsonBuilder gsonBuilder = new GsonBuilder();
    gsonBuilder.registerTypeAdapter(AllUserDetailsKeyModel.class, new UserDetailsDeserializer());
    Gson gson = gsonBuilder.create();
    return GsonConverterFactory.create(gson);
  }

Dies ist der benutzerdefinierte Konverter für die Nachrüstung.

In Ihrer onResponse-Schleife führen Sie einfach eine Schleife mit Hashmaps durch und erhalten den Wert per Schlüssel. Meine Modellklasse sieht wie folgt aus: -

public class AllUserDetailsKeyModel {

  private Map<String, AllUserDetailsResponseModel> result;

  public Map<String, AllUserDetailsResponseModel> getResult() {
    return result;
  }

  public void setResult(Map<String, AllUserDetailsResponseModel> result) {
    this.result = result;
  }

}

Wahrscheinlich müssen Sie einen Typ T angeben, wobei T Ihr Datentyp ist und mein Modell nur aus einer Hashmap und Getter und Setter dafür besteht.

Und schließlich stellen Sie Custom Convertor wie folgt auf Nachrüstung ein: - .addConverterFactory(createGsonConverter())

Lassen Sie mich wissen, wenn Sie weitere Erläuterungen benötigen.

bv akhil
quelle
0

Verwenden Sie GenericTypeIndicator, um die Liste der untergeordneten Knoten aus der strukturierten FireBase ArrayList-Datenbank abzurufen

   //Start of Code
   Firebase ref = new Firebase(FIREBASE_URL);
   ref.addValueEventListener(new ValueEventListener(){
      @Override
      public void onDataChange(DataSnapshot snapshot){
         GenericTypeIndicator<List<YourClassName>> t = new GenericTypeIndicator<List<YourClassName>>{};
         List<YourClassName> messages = snapshot.getValue(t);
         Log.d("Get Data Size", messages.size());
          }
      }
      @Override
      public void onCancelled(FirebaseError firebaseError){
          Log.e("The read failed: ",firebaseError.getMessage());
      }
   });
Das schwarze Pferd
quelle
0

Ihr Problem ist, warum Ihr Code nicht funktioniert.

das ist dein Code:

Firebase ref = new Firebase(FIREBASE_URL);

  ref.addValueEventListener(new ValueEventListener() {
      @Override
      public void onDataChange(DataSnapshot snapshot) {
          Log.e("Count " ,""+snapshot.getChildrenCount());
          for (DataSnapshot postSnapshot: snapshot.getChildren()) {
            <YourClass> post = postSnapshot.getValue(<YourClass>.class);
            Log.e("Get Data", post.<YourMethod>());
          }
      }
      @Override
      public void onCancelled(FirebaseError firebaseError) {
          Log.e("The read failed: " ,firebaseError.getMessage());
      }
  })

Sie vermissen das Einfachste: getChildren()

FirebaseDatabase db = FirebaseDatabase.getInstance();
DatabaseReference reference = FirebaseAuth.getInstance().getReference("Donald Trump");

reference.addValueEventListener(new ValueEventListener() {
   @Override
   public void onDataChange(DataSnapshot dataSnapshot) {

            int count = (int) dataSnapshot.getChildrenCount(); // retrieve number of childrens under Donald Trump

            String[] hairColors = new String[count];

            index = 0;
            for (DataSnapshot datas : dataSnapshot.getChildren()){

                hairColors[index] = datas.getValue(String.class);

            }
            index ++

            for (int i = 0; i < count; i++)
            Toast(MainActivity.this, "hairColors : " + hairColors[i], toast.LENGTH_SHORT).show();

            }

    }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }

    });
Vaiana
quelle
index ++; muss sich in der for (DataSnapshot-Daten: dataSnapshot.getChildren ()) befinden {
Lotfi
0
ArrayList<String> keyList = new ArrayList<String>();
mKeyRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for (DataSnapshot childDataSnapshot : dataSnapshot.getChildren()) {
                String temp = childDataSnapshot.getKey();
                keyList.add(temp);
                i = keyList.size();

            }
        }
        @Override
        public void onCancelled(DatabaseError databaseError) {
            throw databaseError.toException();
        }
    });

Dieser Code funktioniert einwandfrei, um alle Firebase-Schlüssel zur Arrayliste hinzuzufügen. Sie können dies mit Firebase-Werten oder anderen statischen Werten tun.

BHargav D Patel
quelle
Nur-Code-Antworten werden nicht empfohlen. Bitte bearbeiten Sie Ihre Antwort und fügen Sie einige Wörter hinzu, die erklären, wie das Problem gelöst wird und / oder wie es sich von den anderen Antworten unterscheidet.
Nick
0
DatabaseReference mRootRef = FirebaseDatabase.getInstance().getReference();
        DatabaseReference mMainMenuRef = mRootRef.child("tut_master");//main
        DatabaseReference mSubMenuRef = mMainMenuRef.child("english");//sub
        List<Tutorial>   tutorialNames=new ArrayList<>();
        mSubMenuRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {

                for(DataSnapshot ds : dataSnapshot.getChildren()) {
                    long id = ds.child("id").getValue(Long.class);
                    String name = ds.child("name").getValue(String.class);

                    Tutorial tut = new Tutorial();
                    tut.setTutId(id+"");
                    tut.setTutName(name);
                    tutList.add(tut);

                }

            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }


        });
Sreejesh K Nair
quelle
0
 private FirebaseDatabase firebaseDatabase=  FirebaseDatabase.getInstance();
    private DatabaseReference databaseReference=  firebaseDatabase.getReference();
    private DatabaseReference mChildReference= databaseReference.child("data");

  mChildReference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                for(DataSnapshot ds : dataSnapshot.getChildren()) {
                    User commandObject = ds.getValue(User.class);
                    Log.d("TAG", commandObject.getMsg());
                }
                Toast.makeText(MainActivity.this,dataSnapshot.toString(),Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });

Dies hilft Ihnen, Sie müssen nur eine Modellklasse erstellen, die String msg enthält.

Prateek Gupta
quelle
0

Verwenden Sie Gson ist meine Lieblingslösung.

mFirebaseRef.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        Type StringListType = new TypeToken<List<String>>(){}.getType();
        List<String> td = new Gson().fromJson(dataSnapshot.getValue(), StringListType);
    }
});

Wenn Sie der Meinung sind, dass der Code zum Abrufen von TypeToken nicht intuitiv ist. Sie können eine Klasse schreiben, die alle benötigten Typen enthält. Beim nächsten Mal können Sie diese Typen also schnell erhalten.

class TypeTokens{
    static public final Type StringListType = new TypeToken<List<String>>(){}.getType();
    static public final Type StringMapType = new TypeToken<Map<String, String>>(){}.getType();
    static public final Type LongMapType = new TypeToken<Map<String, Long>>(){}.getType();
    static public final Type DateMapType = new TypeToken<Map<String, Date>>(){}.getType();
}
Wu Yuan Chun
quelle