recuperar leer guardar example datos crear java android firebase mapping firebase-database

java - leer - Cómo almacenar un UID de usuario en una base de datos de firebase y hacer que se asigne a un POJO



push firebase android (2)

CONTEXTO

Actualmente estoy trabajando en una aplicación de Firebase (en Android). He configurado la autenticación, el almacenamiento y la base de datos sin problemas de los que hablar. Como el usuario de autenticación de Firebase solo tiene algunas propiedades, he creado un POJO de "usuario" para almacenar información de usuario adicional que no está contenida dentro del usuario de autenticación de Firebase (es decir, nombre, fecha de nacimiento, nacionalidad, etc.) . La estructura de esto se muestra en la imagen a continuación:

El UUID en la imagen es el usuario auth uid respectivo. Esto se logró como tal:

ref.child(users).child(auth.getUid()).setValue(user);

Este enfoque parece estar en línea con la documentación ya que me permite restringir la escritura / lectura al propietario de la cuenta usando la auth.uid === $uid . Además, todas las propiedades dentro del árbol se asignan a mi POJO como se esperaba.

PROBLEMA

Mi único gran problema es que quiero almacenar los usuarios uid dentro del POJO. Como el UID está actualmente estructurado como el objeto primario, no estoy seguro de cómo asignarlo al usuario POJO. Por supuesto, podría almacenar un campo adicional en el nivel inferior del árbol. Sin embargo, eso parece una redundancia de datos sin sentido.

PREGUNTA

Cuál es la mejor manera de asignar el uid a una clase POJO de "usuario" respectiva. Idealmente, podría buscar 10 usuarios para mostrar, y cuando se toca uno, la aplicación carga una actividad de perfil. Esto significaría pasar el fluido del usuario, por lo que puedo decir:

ref.child(users).child(targetUID)

y buscar la cuenta del usuario intervenido. Esto significa tener su uid.


Tuve el mismo problema al usar FirebaseRecyclerAdapter , así que copié el código y agregué el siguiente método ya que el adaptador almacena las instantáneas.

public String getItemKey(int position) { return mSnapshots.getItem(position).getKey(); }

Ahora puede establecer el UID del usuario utilizando un setter.

EDIT: estaba pensando algo así

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; } }

Y en el adaptador de Firebase''s populateView()

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); }


Usé dos enfoques para resolver esto. Uno es tener ese campo adicional, teniendo así la redundancia, y el otro es usar un HashMap para mapear el POJO del Usuario con su UID.

Si ha notado que cada vez que carga los datos de la base de datos de Firebase, en su mayoría tiene forma de mapa, lo único que hice fue guardar la clave en un mapa, que usa esa clave para mapear el POJO del usuario. Ese mapa se almacenó en un singleton para que se pueda acceder desde cualquier lugar de la aplicación.

Algo como esto -

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 esta manera puedo obtener al usuario simplemente usando el UID ( getSingletonMap().get(uid) ) o puedo obtener el usuario de un usuario . Espero que esto responda tu pregunta.