Ich bin neu in der Datenbank firebase
und nosql
Ich versuche, bestimmte Daten von einer Firebase abzurufen. Ich habe einen Knoten universities
und dieser Knoten hat viele eindeutige Bezeichner als Knoten, der so mehr Daten enthält. Ich möchte name
von jedem Knoten abrufen.
Bitte schauen Sie sich das an.
Was ich bisher ausprobiert habe: Ich habe versucht, addChildEventListener
zu verwenden, aber das hört nur das erste Kind. Ich habe es debuggt und es wurden nur die Werte des ersten untergeordneten Objekts von universities
angezeigt.
myRef.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
List<University> university = new ArrayList<>();
Map<String, Object> td = (HashMap<String, Object>) dataSnapshot.getValue();
Log.d("TAG",dataSnapshot.getValue().toString());
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
Ich habe auch addValueEventListener
ausprobiert. Dadurch wird der gesamte Knoten abgehört und vollständige Daten zurückgegeben. Ich kann jedoch keinen "Namen" dafür extrahieren, da er eindeutige Bezeichner enthält.
Bitte führen Sie mich in die richtige Richtung.
myRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
University university = dataSnapshot.getValue(University.class);
List<University> universities = (List<University>) dataSnapshot.getValue(University.class);
*//*List<String> lst = new ArrayList<String>();
for(DataSnapshot dsp : dataSnapshot.getChildren()){
lst.add(dsp.getKey());
}
Log.d("TAG",lst.toString());*//*
Map<String, Object> td = (HashMap<String, Object>) dataSnapshot.getValue();
*//*List<Object> values = new ArrayList<Object>(td.values());
List<String> list=new ArrayList<String>();
for(int i=0; i<values.size(); i++){
list.add((String) values.get(i));
}*//*
Log.d("TAG", university.toString());
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
Wenn Sie addValueEventListener
zum Abrufen aller Universitäten von Firebase verwenden
List<University> universityList = new ArrayList<>();
myRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
universityList.clear();
for (DataSnapshot postSnapshot: snapshot.getChildren()) {
University university = postSnapshot.getValue(University.class);
universityList.add(university);
// here you can access to name property like university.name
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
System.out.println("The read failed: " + firebaseError.getMessage());
}
});
Oder wenn Sie addChildEventListener
verwenden
List<University> universityList = new ArrayList<>();
myRef.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
University university = dataSnapshot.getValue(University.class);
universityList.add(university);
Log.i(TAG,"add university name = " + university.name);
...
}
...
}
Sie können equalTo () von Query verwenden, um Ihre benutzerdefinierte Zeichenfolge an die Firebase-Datenbank anzupassen.
auf diese Weise können Sie Ihre Abfrage erstellen und Listener damit festlegen
Query queryRef = myFirebaseRef.orderByChild("name").equalTo("some name");
verweisen Sie auf this thread für mehr.
Hier ist ein schönes Beispiel von Firebase-Funktionären, verweisen Sie darauf und Sie werden eine klare Vorstellung bekommen
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) {
User user = postSnapshot.getValue(User.class);
list.add(user);
}
}
Klasse Benutzer
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;
}
Liste mit Klasse binden
List<User> list== new ArrayList <>();
100% wird es funktionieren
Zu Linhs Antwort zur Verwendung der addEventListener
-Methode. Sie können GenericTypeIndicator
verwenden, um die Liste der benötigten Objekte direkt zu erstellen. Hier ein kurzes Beispiel:
List<University> universityList = new ArrayList<>();
myRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
GenericTypeIndicator<List<University>> t = new GenericTypeIndicator<List<University>>() {};
universityList = snapshot.getValue(t);
}
@Override
public void onCancelled(DatabaseError databaseError) {
System.out.println("The read failed: " + firebaseError.getMessage());
}
});
Hoffe, diese Antwort hilft.