Je suis nouveau dans les bases de données firebase
et nosql
J'essaie de récupérer des données spécifiques d'une base Firebase. J'ai un noeud universities
et ce noeud a beaucoup d'identifiant unique en tant que noeud qui contient tellement de données. Je veux récupérer name
de chaque nœud.
S'il vous plaît jeter un oeil à cela.
Ce que j’ai essayé jusqu’à présent: j’ai essayé d’utiliser addChildEventListener
mais cela n’écoute que le premier enfant. Je l'ai débogué et il ne montrait que les valeurs du premier enfant du noeud universities
.
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) {
}
});
J'ai aussi essayé addValueEventListener
. Cela écoute le noeud entier et renvoie des données complètes, mais je ne parviens pas à en extraire le "nom", car il contient des identificateurs uniques.
Veuillez me guider dans les bonnes directions.
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) {
}
});
Si vous utilisez addValueEventListener
pour extraire toutes les universités de Firebase
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());
}
});
Ou si vous utilisez addChildEventListener
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);
...
}
...
}
Vous pouvez utiliser equalTo () de Query dans lequel vous pouvez transmettre votre chaîne personnalisée pour qu'elle corresponde à la base de données firebase.
comme cela, vous pouvez créer votre requête et définir un auditeur avec cette
Query queryRef = myFirebaseRef.orderByChild("name").equalTo("some name");
se référer this thread pour plus.
Ici est un bel exemple des représentants de Firebase, référez-le et vous aurez une idée claire
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) {
User user = postSnapshot.getValue(User.class);
list.add(user);
}
}
utilisateur de classe
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 de liaison avec la classe
List<User> list== new ArrayList <>();
100% cela fonctionnera
Concernant la réponse de Linh à propos de l’utilisation de la méthode addEventListener
. Vous pouvez utiliser GenericTypeIndicator
afin de créer directement la liste des objets dont vous aurez besoin. Voici un exemple rapide:
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());
}
});
J'espère que cette réponse aide.