Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to link between Authenticated users and Database in Firebase?

I have Firebase Authentication in my Android app. My question is how do I link between authenticated users (that appear in Firebase::Auth tab in the Firebase console) and the database (Firebase::Database tab).

I need to link data in the database with the relevant user in Auth by the User UID that appears in Auth, and eventually send queries about a specific UID to get the relevant info in Database.

Is there something automatic / built-in that does that or do I have to create a new entry for a user in Database each time I authenticate a user and then create an ID field for it with the UID value that appears in Auth?

In the User Management docs it explains only about adding users to the Auth tab and resetting their passwords.

like image 828
Alaa M. Avatar asked Oct 12 '16 14:10

Alaa M.


1 Answers

After authentication, create a child with the UID given by Firebase, and set its value to your user class:

//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 is a direct child of root.

Then when you want to retrieve the data, get a reference to the user by its UID, listen for addListenerForSingleValueEvent() (invoked only once), and iterate over the result with reflection:

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

edit:

Or without reflection:

@Override
public void onDataChange(DataSnapshot dataSnapshot) {
    final Profile p = dataSnapshot.getValue(Profile.class);
}
like image 92
Alaa M. Avatar answered Oct 18 '22 20:10

Alaa M.