web-dev-qa-db-fra.com

Lire les données de la base de données Firebase

Je veux lire des données spécifiques de la base de données firebase. Ce que je suis en train de faire est ici. 

DatabaseReference database = FirebaseDatabase.getInstance().getReference();
DatabaseReference myRef = database.child("profiles/");

myRef.child(phoneNo).addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        user = dataSnapshot.getValue(User.class);
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {}

});

 enter image description here

Méthode pour écrire dans la base de données

public void writeToDBProfiles(Object data,String phoneNo) {
    DatabaseReference database = FirebaseDatabase.getInstance().getReference();
    DatabaseReference myRef = database.child("profiles/" + phoneNo);
    myRef.setValue(data);
}

Mais son retour à zéro ... Toute aide sera appréciée.

7
Hassan Niazi

Ok, j'ai tout réglé. le code ci-dessus dans la question est parfaitement correct et devrait fonctionner. J'explique pour les utilisateurs ultérieurs qui pourraient avoir le même problème en raison des erreurs que j'ai commises.

singleSnapshot.getValue (User.class); n'a pas été en mesure de convertir le résultat en classe utilisateur car lors du téléchargement des données, c'est-à-dire dans setValue, mon photoUrl était égal à null et vous pouviez donc voir que photoUrl n'était pas présent dans mon noeud enfant. Donc, ce que je crois, c'est (et peut-être que quelqu'un veut me corriger, ceci) que ma méthode singleSnapshot.getValue n'a pas pu convertir le résultat.

Donc, pour l'instant, j'ai omis photoUrl de ma classe d'utilisateurs et j'y reviendrai lorsque je commencerai à travailler avec le module correspondant.

Merci encore à tous pour toutes les suggestions et l'aide. 

public class User {
String name;
Uri photoURL;
String bloodGroup;
String city;
String country;
double latitude;
double longitude;
boolean availableToDonate;

// Get, set and constructors are obvious here I am just saving some space in the post
}
2
Hassan Niazi

Si vous souhaitez obtenir des données spécifiques à l'aide d'un numéro de téléphone, vous pouvez utiliser une requête de ce type.

DatabaseReference database = FirebaseDatabase.getInstance().getReference();
DatabaseReference ref = database.child("profiles");

Query phoneQuery = ref.orderByChild(phoneNo).equalTo("+923336091371");
phoneQuery.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot singleSnapshot : dataSnapshot.getChildren()){
           user = singleSnapshot.getValue(User.class); 
        }
    }
    @Override
    public void onCancelled(DatabaseError databaseError) {
        Log.e(TAG, "onCancelled", databaseError.toException());
    }
});

Je pense que c'est la meilleure méthode.

13
Inducesmile

MIS À JOUR:

_ {L'erreur dans votre code mis à jour est ici.

myRef.setValue(data);

Si vous allez ajouter des données en tant que myRef.setValue (data), alors vous devez spécifier exactement quel enfant reçoit les données ou si vous souhaitez mettre à jour tous les enfants simultanément , vous devez Effectuez la mise à jour des données atomiques à l'aide de la méthode HashMap () et updateChildren ().

Donc, pour la mise à jour spécifique d'un enfant, la manière correcte est la suivante:

myRef.child("name").setValue(data);

Je vous encourage à lire ceci blog officiel de firebase pour comprendre comment mettre à jour tous les enfants en une fois en utilisant HashMap ().

Faites-moi savoir si cela change quelque chose pour vous.

0
Nishant Dubey

lors de la localisation de la base de données de votre base de feu, vous devez toujours utiliser ce nom de dossier entre guillemets, utilisez DatabaseReference myRef = database.child ("profiles");

au lieu de DatabaseReference myRef = database.child ("profiles /");

0
Syyam Noor