2016-07-08 5 views
6

CONTEXT auf einer Firebase AnwendungWie ein Benutzer UID in einer Feuerbasis Datenbank speichern und zu einem POJO

arbeite ich zur Zeit (in Android) Karte hat. Ich habe die Authentifizierung, den Speicher und die Datenbank ohne nennenswerte Probleme eingerichtet. Da der Firebase Auth Benutzer nur ein paar Eigenschaften hat, habe ich ein "Benutzer" POJO erstellt, um zusätzliche Benutzerinformationen zu speichern, die nicht im Firebase Auth Benutzer enthalten sind (zB Vorname, Geburtsdatum, Nationalität, etc ...) . Die Struktur dieser ist in der folgenden Abbildung dargestellt:

demo of structure

Die UUID in dem Bild ist der Benutzer jeweilige auth uid. Dies wurde als solche erreicht:

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

Dieser Ansatz scheint mit der Dokumentation im Einklang, wie es mir Schreib beschränken erlaubt/an den Kontoinhaber las mit der auth.uid === $uid Regel. Außerdem entsprechen alle Eigenschaften innerhalb des Baums meinem POJO wie erwartet.

PROBLEM

Mein ein großes Problem ist, dass ich die Benutzer uid in der POJO speichern möchten. Da die UID derzeit als übergeordnete Objekte strukturiert ist, bin ich mir nicht sicher, wie ich sie dem Benutzer POJO zuordnen soll. Ich könnte natürlich ein zusätzliches Feld in der untersten Baumebene speichern. Dies scheint jedoch sinnlose Datenredundanz zu sein.

FRAGE

Was ist der beste Weg, um die uid mit einem entsprechenden „user“ POJO Klasse zuzuordnen. Im Idealfall würde ich 10 Benutzer zum Anzeigen abrufen können, und wenn eine angeklickt wird, laden Sie die App eine Profilaktivität. Dies würde bedeuten, die Benutzer-ID des Benutzers läuft, so kann ich sagen:

ref.child(users).child(targetUID) 

und holt das abgegriffene Benutzerkonto. Dies bedeutet, ihre UID zu haben.

Antwort

4

Ich hatte das gleiche Problem bei der Verwendung FirebaseRecyclerAdapter, so kopierte ich den Code und fügte die folgende Methode hinzu, da der Adapter die Snapshots speichert.

Jetzt können Sie einfach die UID des Benutzers mit einem Setter festlegen.

EDIT: Ich war etwas in diese Richtung

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

Und in Ihrer Firebase Adapters 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

Dies funktioniert genauso wie die integrierte 'adapter.getRef (position) .getKey()'. –

+0

Ah .. Ich habe das überall gesucht, aber ich konnte es nicht finden ... trotzdem habe ich den Code geändert, damit ich den FirebaseListAdapter filterbar machen konnte. –

+0

Klingt wie eine nette Abwechslung. Aber es hat wenig mit dieser Frage zu tun. Kannst du deine Antwort aktualisieren, um zu zeigen, wie ein minimaler POJO aussieht, der es erlaubt, den Schlüssel/die UID einzustellen und wie du es benutzen würdest? –

2

habe ich zwei Ansätze zu denken, diese zu lösen . Eine besteht darin, dieses zusätzliche Feld zu haben, und somit die Redundanz zu haben, und die andere besteht darin, eine HashMap zu verwenden, um das POJO des Benutzers mit seiner UID abzubilden.

Wenn Sie bemerkt haben, dass, wann immer Sie die Daten aus der Firebase-Datenbank laden, meistens in der Form einer Map ist, habe ich nur den Schlüssel in einer Map gespeichert, die den POJO des Benutzers mit diesem Schlüssel abbildet . Diese Karte wurde in einem Singleton gespeichert, so dass von überall in der App darauf zugegriffen werden konnte.

Etwas Ähnliches -

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

diese Weise kann ich den Benutzer erhält nur durch die UID mit (getSingletonMap().get(uid)) oder kann get the uid of a user. Ich hoffe, das beantwortet deine Frage.