2016-09-16 94 views
1

我想從我的火力地堡數據庫 得到的數據我有兩個片段,一個用於註冊,另一個用於在 簽署我有一個將數據插入到火力地堡沒有問題,但不知何故,我」米無法從它onDataChange的值返回null

這些都是從我籤一些代碼片段中返回數據:

private FirebaseAuth mAuth; 
private FirebaseAuth.AuthStateListener mAuthListener; 

@Override 
    public void onStart() { 
     super.onStart(); 
     mAuth.addAuthStateListener(mAuthListener); 
    } 

    @Override 
    public void onStop() { 
     super.onStop(); 
     if (mAuthListener != null) { 
      mAuth.removeAuthStateListener(mAuthListener); 
     } 
    } 

我裏面onCreate方法驗證碼:

mAuth = FirebaseAuth.getInstance(); 
     mAuthListener = new FirebaseAuth.AuthStateListener() { 
      @Override 
      public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { 
       user = firebaseAuth.getCurrentUser(); 
       if(user != null) 
       { 
        getExistingUserInfo(user.getUid()); 
      } 
     }; 

這是我從我的firebase

public void getExistingUserInfo(String uid){ 

     final FirebaseDatabase database = FirebaseDatabase.getInstance(); 

     database.getReference("allUsers").child(uid) 
       .orderByChild("emailAddress") 
       .equalTo(mEmailStr) 
       .addValueEventListener(new ValueEventListener() { 
        @Override 
        public void onDataChange(DataSnapshot dataSnapshot) { 
         Log.e("Data Changed YEA!",dataSnapshot.toString()); 

        } 

        @Override 
        public void onCancelled(DatabaseError databaseError) { 
        } 

       }); 

問題是,當我啓動應用程序和getExistingUserInfo被稱爲內onCreate,則返回最後在用戶簽名的數據query的數據的方法我的設備正確

> E/Data Changed YEA!: DataSnapshot { key = 
> vWOypZ07sbeQKEtXnAwbEEV7ml43, value = {password=123456789, 
> username=ahmed, sgl=true, [email protected], 
> studyGroupName=Study Group 2} } 

但是當我按下登錄,它的值返回空

E/Data Changed YEA!: DataSnapshot { key = vWOypZ07sbeQKEtXnAwbEEV7ml43, value = null } 

所以我必須關閉應用程序並重新打開它才能正確獲取數據!

的是用戶獲取簽署了代碼,這是一個clickListener裏面onCreateView方法:

mAuth.signInWithEmailAndPassword(mEmailStr, mPasswordStr).addOnCompleteListener(getActivity(), new OnCompleteListener<AuthResult>() { 
        @Override 
        public void onComplete(Task<AuthResult> task) { 
         if (task.isSuccessful()) 
{ 

Toast.makeText(getContext(),"Succeed!",Toast.LENGTH_LONG).show(); 

          } 
          else 
          { 
           Toast.makeText(getContext(),"Failed!",Toast.LENGTH_LONG).show(); 
          } 
        } 
       }); 

這該是多麼我database樣子:

Click to see the Image

+0

將一個調試'Log'語句添加到'getExistingUserInf o()'顯示'uid'和'mEmailStr'的值。其中一個或兩個可能不是正確的值。 –

+0

問題是,getExistingUserInfo()被多次自動調用,不知道爲什麼,一旦應用程序啓動時第一次被調用幾次,然後一旦我按下登錄,它就會再次被調用,這正是它看起來的樣子像在我的日誌中 http://image.prntscr.com/image/34be85f976b8457384bab7347344c5c0.png –

+0

@Frank,你能幫我嗎? –

回答

1

好吧,首先我不明白你爲什麼使用AuthStateListener 刪除onStartonStoponCreate 替換您getExistingUserInfo這個

public void getExistingUserInfo() { 
    FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser(); 
    String userID = user.getUid(); 
    FirebaseDatabase database = FirebaseDatabase.getInstance(); 
    database.getReference("allUsers").child(userID).addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      hashMap = (HashMap<String, String>) dataSnapshot.getValue(); 
      List<String> dataS = new ArrayList<>(hashMap.values()); 

      for (String data : dataS) { 
       Log.e("Database Data", data); 
      } 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 
} 

郵政signin按鈕onClickListener和內這種方法應該是它

注意:如果你想要做的與返回的數據進行任何那麼你在返回數據後應該在onDataChange之內執行