2016-07-08 37 views
6

CONTESTOCome conservare un UID utenti in un database Firebase e farlo mappare un POJO

Attualmente sto lavorando su un'applicazione Firebase (in Android). Ho impostato l'autenticazione, l'archiviazione e il database senza problemi di cui parlare. Poiché l'utente auth Firebase ha solo alcune proprietà, ho creato un POJO "utente" per archiviare ulteriori informazioni utente che non sono contenute nell'utente auth Firebase (ad es. Nome, data di nascita, nazionalità, ecc ...) . La struttura di questo è illustrato nella figura:

demo of structure

l'UUID nell'immagine è il rispettivo utenti UID autenticazione. Questo è stato ottenuto come tale:

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

Questo approccio sembra in linea con la documentazione in quanto mi permette limito scrittura/lettura al proprietario dell'account utilizzando la regola auth.uid === $uid. Inoltre, tutte le proprietà all'interno della mappa ad albero al mio POJO come previsto.

PROBLEMA

Il mio unico grande problema è che voglio per memorizzare gli utenti UID all'interno del POJO. Poiché l'UID è attualmente strutturato come oggetto principale, non sono sicuro di come mapparlo al POJO dell'utente. Naturalmente potrei conservare un campo aggiuntivo nel livello dell'albero inferiore. Tuttavia, sembra una ridondanza dei dati inutile.

DOMANDA

Qual è il modo migliore per mappare l'uid a una rispettiva classe POJO "utente". Idealmente, sarei in grado di recuperare 10 utenti da visualizzare, e quando uno viene toccato, l'app carica un'attività del profilo. Ciò significherebbe passare l'uid dell'utente, quindi posso dire:

ref.child(users).child(targetUID) 

e recuperare l'account utente toccato. Questo significa avere il loro uid.

risposta

4

Ho avuto lo stesso problema durante l'utilizzo di FirebaseRecyclerAdapter, quindi ho copiato il codice e aggiunto il seguente metodo poiché l'adattatore memorizza le istantanee.

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

Ora è possibile impostare l'UID dell'utente utilizzando un setter.

EDIT: Stavo pensando qualcosa in questo senso

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

E nel dell'adattatore Firebase 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); 
    } 
+1

Questo equivale esattamente all'utilizzo dell'adattatore di memoria 'adapter.getRef (posizione) .getKey()'. –

+0

Ah .. Lo stavo cercando dappertutto ma non riuscivo a trovarlo .. comunque ho cambiato il codice in modo da poter rendere FireBaseListAdapter filtrabile. –

+0

Sembra un bel cambiamento. Ma ha poco a che fare con questa domanda. Puoi aggiornare la tua risposta per mostrare che aspetto ha un POJO minimo che permetta di impostare la chiave/uid e come la useresti? –

2

ho usato due approcci per risolvere questo . Uno è quello di avere quel campo in più, avendo così la ridondanza, e l'altro è usare una HashMap per mappare il POJO dell'utente con il suo UID.

Se avete notato che ogni volta che caricate i dati dal database Firebase, per lo più è sotto forma di una mappa, quindi tutto ciò che ho fatto è stato salvare la chiave in una mappa, che utilizza tale chiave per mappare il POJO dell'utente . Quella mappa è stata memorizzata in un singleton, quindi è possibile accedervi da qualsiasi punto dell'app.

Qualcosa di simile -

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

In questo modo posso ottenere l'utente semplicemente utilizzando l'UID (getSingletonMap().get(uid)) o può get the uid of a user. Spero che questo risponda alla tua domanda.