2016-09-16 61 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之内执行