web-dev-qa-db-ja.com

Firebaseで認証済みユーザーとデータベースをリンクする方法は?

AndroidアプリにFirebase認証があります。私の質問は、認証されたユーザー(Firebaseコンソールの[Firebase::Auth]タブに表示されます)とデータベース(Firebase::Database タブ)。

データベース内のデータをAuthにあるUser UIDによってAuthの関連ユーザーとリンクし、最終的にUIDの関連情報を取得するために特定のDatabaseに関するクエリを送信する必要があります。

それを行う自動/組み込みの何かがありますか、またはユーザーを認証し、Databaseに表示されるUID値でIDフィールドを作成するたびにAuthにユーザーの新しいエントリを作成する必要がありますか?

ser Management docs では、Authタブへのユーザーの追加とパスワードのリセットについてのみ説明しています。

13
Alaa M.

認証後、Firebaseによって指定されたUIDで子を作成し、その値をユーザークラスに設定します。

_//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はルートの直接の子です。

次に、データを取得する場合は、UIDを使用してユーザーへの参照を取得し、addListenerForSingleValueEvent()(1回だけ呼び出されます)をリッスンし、リフレクションで結果を反復処理します。

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

編集:

または反射なし:

_@Override
public void onDataChange(DataSnapshot dataSnapshot) {
    final Profile p = dataSnapshot.getValue(Profile.class);
}
_
12
Alaa M.