2017-04-09 115 views
0

我已經爲Firebase創建了一個登錄系統。用戶可以使用用戶名或密碼進行身份驗證。這可以通過在Firebase數據庫中創建鏈接用戶名和電子郵件的表來實現。使用用戶名原子的Firebase用戶註冊

問題是,當用戶註冊時,他可以對「firebase」的createUserWithEmailAndPassword()調用和將用戶添加到數據庫的完成處理程序之間做任何事情。例如:回到上一個活動,使用onpause暫停應用程序,旋轉屏幕,... 如果用戶正在做這些事情,則可能是用戶已註冊但未寫入數據庫

我如何確保這筆交易是全部還是全無?我想過使用intentservice,完成後會自行停止,但是這真的是要走的路嗎?

private void register(final String email,final String username,final String password) 
{ 
    mAuth.createUserWithEmailAndPassword(email, password).addOnCompleteListener(this, new OnCompleteListener<AuthResult>() 
    { 
     @Override 
     public void onComplete(@NonNull Task<AuthResult> task) 
     { 
      Log.d("FIREBASE Register", "createUserWithEmail:onComplete:" + task.isSuccessful()); 
      showProgress(false); 

      if(task.isSuccessful()) 
      { 
       Resources res = getResources(); 
       SharedPreferences prefs = getSharedPreferences(res.getString(R.string.package_name), Context.MODE_PRIVATE); 
       SharedPreferences.Editor editor = prefs.edit(); 
       editor.putString("email",  email); 
       editor.putString("password", password); 
       editor.commit(); 


       // Write new user 
       FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser(); 
       writeNewUser(user.getUid(), username, email); 

       // Send verification email 
       sendVerificationEmail(); 

       // Sign out the user, to block the loginActivity from logging in the user (the email isn't verified) 
       FirebaseAuth.getInstance().signOut(); 
      } 
    } 
} 
+0

該任務由firebase在後臺處理,你不必做任何事情 –

+0

不,當你需要額外的電話到firebase存儲用戶名 – PrisonMike

+0

你試過了嗎? –

回答

0

我認爲這是最好的辦法,因爲如果用戶離開該應用程序會強迫他做的一切再次

@Override 
public void onDestroy() { 
    final FirebaseAuth mAuth=FirebaseAuth.getInstance(); 
    final FirebaseUser user=mAuth.getCurrentUser(); 
    final DatabaseReference mdatabase=FirebaseDatabase.getInstance().getReference().child("USERS NODE").child(user.getUid()); 
    mdatabase.addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      if(dataSnapshot==null){ 
       //DATA HAS NOT BEEN SUMBITED 
       if(user!=null){ 

        user.delete() 
          .addOnCompleteListener(new OnCompleteListener<Void>() { 
           @Override 
           public void onComplete(@NonNull Task<Void> task) { 
            if (task.isSuccessful()) { 

            } 
           } 
          }); 
       } 
      } 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 



} 
+0

我不認爲這是一個解決方案。用戶的電子郵件將被註冊,並且Firebase中的用戶名/電子郵件表將爲空。事情仍然會不一致。如果用戶離開活動,此代碼只是註銷用戶。但是這給我帶來了一個想法:如果未完成未被調用,我可以使用ondestroy刪除用戶 – PrisonMike

+0

只做了一個編輯,使用這個編輯它不會不一致 –

+0

這確實會更好。我會在稍後檢查。謝謝 – PrisonMike