0

爲了在我的應用程序中登錄/註冊用戶,我使用了firebase authUI,我想知道用戶什麼時候第一次註冊,何時他是返回用戶誰只是登錄。我認爲這是一個好主意,「在數據庫中查看」是否存在當前的UID,是否存在用戶,以及是否存在新用戶。ValueEventLister檢索到Firebase數據庫後運行代碼

下面是可正常工作的代碼,但ValueEventLister「調用」是異步的,當它檢查用戶UID時,它已經存在,因爲它只是寫在數據庫中,但實際上它是一個新用戶。我應該如何修改我的代碼才能按預期工作?

@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) { 

     } 
    }); 

除了這些,如果你的用戶停留的應用程序會話之間簽訂的,那麼你可以簡單地使用身份驗證狀態聽衆。