J'ai l'authentification Firebase dans mon Android. Ma question est de savoir comment établir un lien entre des utilisateurs authentifiés (qui apparaissent dans Firebase::Auth
onglet dans la console Firebase) et la base de données (Firebase::Database
tab).
J'ai besoin de lier les données de la base de données avec l'utilisateur concerné dans Auth
par le User UID
qui apparaît dans Auth
, et éventuellement envoyer des requêtes sur un UID
spécifique pour obtenir les informations pertinentes dans Database
.
Y a-t-il quelque chose d'automatique/intégré qui fait cela ou dois-je créer une nouvelle entrée pour un utilisateur dans Database
chaque fois que j'authentifie un utilisateur et puis crée un champ ID pour lui avec la valeur UID qui apparaît dans Auth
?
Dans les Documents de gestion des utilisateurs , il explique uniquement l'ajout d'utilisateurs à l'onglet Auth
et la réinitialisation de leurs mots de passe.
Après l'authentification, créez un enfant avec l'UID donné par Firebase et définissez sa valeur sur votre classe d'utilisateurs:
//get firebase user
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
//get reference
DatabaseReference ref = FirebaseDatabase.getInstance().getReference(USERS_TABLE);
//build child
ref.child(user.getUid()).setValue(user_class);
USERS_TABLE est un enfant direct de root.
Ensuite, lorsque vous souhaitez récupérer les données, obtenez une référence à l'utilisateur par son UID, écoutez addListenerForSingleValueEvent()
(invoqué une seule fois) et parcourez le résultat avec réflexion:
//get firebase user
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
//get reference
DatabaseReference ref = FirebaseDatabase.getInstance().getReference(USERS_TABLE).child(user.getUid());
//IMPORTANT: .getReference(user.getUid()) will not work although user.getUid() is unique. You need a full path!
//grab info
ref.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
final Profile tempProfile = new Profile(); //this is my user_class Class
final Field[] fields = tempProfile.getClass().getDeclaredFields();
for(Field field : fields){
Log.i(TAG, field.getName() + ": " + dataSnapshot.child(field.getName()).getValue());
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
modifier:
Ou sans réflexion:
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
final Profile p = dataSnapshot.getValue(Profile.class);
}