LE CONTEXTE
Je travaille actuellement sur une application Firebase (sous Android). J'ai mis en place l'authentification, le stockage et la base de données sans aucun problème. Comme l'utilisateur autorisé Firebase n'a que quelques propriétés, j'ai créé un POJO "utilisateur" pour stocker des informations utilisateur supplémentaires qui ne sont pas contenues dans l'utilisateur authentifié Firebase (c'est-à-dire prénom, date de naissance, nationalité, etc.). . La structure de ceci est montrée dans l'image ci-dessous:
L'UUID dans l'image est l'auth uid respectif de l'utilisateur. Ceci a été réalisé comme tel:
ref.child(users).child(auth.getUid()).setValue(user);
Cette approche semble conforme à la documentation, car elle me permet de restreindre l’écriture/la lecture au propriétaire du compte à l’aide de la règle auth.uid === $uid
. En outre, toutes les propriétés à l'intérieur de l'arborescence correspondent à mon POJO, comme prévu.
PROBLÈME
Mon seul gros problème est que je veux stocker l’utilisateur dans le POJO. Comme l'UID est actuellement structuré en tant qu'objet parent, je ne sais pas comment le mapper à l'utilisateur POJO. Je pourrais bien sûr stocker un champ supplémentaire dans le niveau inférieur de l’arbre. Cependant, cela semble être une redondance inutile des données.
QUESTION
Quel est le meilleur moyen de mapper l'uid vers une classe POJO "utilisateur" respective. Idéalement, je serais capable d'extraire 10 utilisateurs à afficher et, lorsqu'un utilisateur est appuyé, l'application charge une activité de profil. Cela voudrait dire passer l’utilisateur de l’utilisateur, je peux donc dire:
ref.child(users).child(targetUID)
et récupérez le compte d'utilisateur engagé. Cela signifie avoir leur uid.
J'avais le même problème lors de l'utilisation de FirebaseRecyclerAdapter
. J'ai donc copié le code et ajouté la méthode suivante, car l'adaptateur stocke les instantanés.
public String getItemKey(int position) {
return mSnapshots.getItem(position).getKey();
}
Maintenant, vous pouvez simplement définir l'UID de l'utilisateur à l'aide d'un setter.
EDIT: Je pensais quelque chose dans ce sens
User.Java
public class User {
private String name;
private String email;
private String UID;
public User() {
}
public String getUID() {
return UID;
}
public void setUID(String UID) {
this.UID = UID;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Et dans la fonction populateView()
de votre adaptateur Firebase
String UID;
FirebaseListAdapter<User> searchAdapter = new FirebaseListAdapter<User>(getActivity(), User.class, R.layout.user_layout, mRef) {
@Override
protected void populateView(View v, User model, int position) {
// If you really need to set the UID here
// model.setUID = getRef(position).getKey();
// Otherwise, I would just set a String field as shown
//and pass it with the intent to get the UID
//in the profile Activity
UID = getRef(position).getKey
((TextView) v.findViewById(R.id.text1)).setText(model.getName());
((TextView) v.findViewById(R.id.text2)).setText(model.getEmail());
v.setOnClickListener(MainActivity.this);
}
};
@Override
public void onClick(View v) {
Intent intent = new Intent(this, ProfileActivity.class);
intent.putStringExtra(UID_EXTRA, UID);
startActivity(intent);
}
J'ai utilisé deux approches pour résoudre ce problème. L'une consiste à disposer de ce champ supplémentaire et ainsi à la redondance, et l'autre à utiliser une carte de hachage pour mapper le POJO de l'utilisateur avec son UID.
Si vous avez remarqué que chaque fois que vous chargez les données de la base de données Firebase, il s’agit généralement d’une carte. C’est pourquoi j’ai simplement enregistré la clé dans une carte, qui utilise cette clé pour mapper le POJO de l’utilisateur. Cette carte était stockée dans un singleton afin de pouvoir y accéder de n'importe où dans l'application.
Quelque chose comme ça -
DatabaseReference mFirebaseRef = FirebaseDatabase.getInstance().getReference("users"); //Add your filter as your requirements. I am currently loading all the users.
mFirebaseRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Map<String, Map> map = (Map<String, Map>) dataSnapshot.getValue();
if (map != null) {
for (String uid : map.keySet()) {//keys will be uid
Map<String, Map> userMap = map.get(uid); //userMap is a single user's data.
User user = new User(userMap); //I have used a constructor to map the populate the properties of the User Model.
getSingletonMap().Push(uid,user); //pushing using the uid
}
}
}
De cette façon, je peux obtenir l'utilisateur simplement en utilisant l'UID (getSingletonMap().get(uid)
) ou peut obtenir l'identifiant d'un utilisateur . J'espère que cela répond à votre question.