0

私のアプリでユーザーをログイン/登録するにはfirebase authUIを使用していますが、ユーザーが最初に登録したときと、私は、現在のUIDが存在するかどうか、それがユーザーであるかどうか、そして新しいユーザーが存在しないかどうかについて、自分のDBで "見る"ことをお勧めします。ValueEventListerがfirebaseデータベースを取得した後にコードを実行

以下は、正常に動作するコードですが、ValueEventListerの "呼び出し"は非同期で、ユーザーUIDをチェックすると、DBに書き込まれただけで実際には新しいユーザーであるために存在します。期待どおりに動作するようにコードを変更するにはどうすればよいですか?

@Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 

     if (requestCode == RC_SIGN_IN) { 

      final FirebaseUser signedUser = mAuth.getCurrentUser(); 

      ValueEventListener postListener = new ValueEventListener() { 
       @Override 
       public void onDataChange(DataSnapshot dataSnapshot) { 
        Log.d(TAG, "onDataChange: " + dataSnapshot.child(getString(R.string.users)).child(signedUser.getUid()).exists()); 
       } 

       @Override 
       public void onCancelled(DatabaseError databaseError) { 
        // Getting Post failed, log a message 
        Log.w(TAG, "loadPost:onCancelled", databaseError.toException()); 
       } 
      }; 

      mDatabase.addListenerForSingleValueEvent(postListener); 


//   uid = setNullToDefaultValue(signedUser.getUid()); 
//   displayName = setNullToDefaultValue(signedUser.getDisplayName()); 
//   email = setNullToDefaultValue(signedUser.getEmail()); 
//   photoUrl = setNullToDefaultValue(signedUser.getPhotoUrl().toString()); 
//   provider = setNullToDefaultValue(signedUser.getProviderId()); 
//   phoneNumber = setNullToDefaultValue(signedUser.getPhoneNumber()); 
// 
//   Log.d(TAG, "onActivityResult: User Signed In!"); 
//   User mUser = new User(uid, displayName, email, photoUrl, provider, phoneNumber); 
//   Map<String, Object> userMap = mUser.toMap(); 
//   mDatabase.child(getString(R.string.users)).child(mAuth.getCurrentUser().getUid()).updateChildren(userMap); 
     } 
    } 

「チェック」が機能しているかどうかを確認するためにコードにコメントしました。

+0

私は理解しません。新しいユーザーを作成した後に新しいユーザーを作成する理由は何ですか? –

答えて

0

FirebaseAuthクラスには、アカウントを作成してアカウントにサインインするための別の方法があります。それぞれのメソッドが呼び出されるたびにコードを実行するメソッドにonCompleteListenerを追加するだけです。例えば、電子メールを介して認証のために、あなたは以下を使用することができます -

mAuth.createUserWithEmailAndPassword(email,password).addOnCompleteListener(new OnCompleteListener<AuthResult>() { 
     @Override 
     public void onComplete(@NonNull Task<AuthResult> task) { 

     } 
    }); 

mAuth.signInWithEmailAndPassword(email,password).addOnCompleteListener(new OnCompleteListener<AuthResult>() { 
     @Override 
     public void onComplete(@NonNull Task<AuthResult> task) { 

     } 
    }); 

これらのほかに、ユーザーがアプリケーションのセッション間で締結したままならば、あなたは、単に認証状態を使用することができますリスナー。

関連する問題