2016-09-16 16 views
1

Firebaseデータベースからデータを取得しようとしています 2つのフラグメントがあり、1つはサインアップ用、もう1つはサインイン用です Firebaseにデータを挿入することに問題はありませんが、これらは、私の記号からいくつかのコードの断片であることonDataChangeの値はnullを返します

からデータを返すことができず、mは:

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

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メソッド内でこのコードを持っています

これは、問題は、私は、アプリケーションとgetExistingUserInfoonCreate内で呼び出されます起動すると、それから、ユーザーに署名した最後のデータを返し、私は私の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) { 
        } 

       }); 

からデータを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 } 

だから、データを正しく取得するには、アプリケーションを閉じてから再度開く必要があります。

ザ・ユーザーが署名されるコードであり、それはclickListeneronCreateViewでメソッド内です:

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 'uid'と' mEmailStr'の値を表示します。一方または両方がおそらく正しい値ではありません。 –

+0

問題は、getExistingUserInfo()が何度も自動的に呼び出され、なぜアプリケーションが開始された後初めて何回か呼び出されたときに、一度サインインすると呼び出されるということです。私のログのように http://image.prntscr.com/image/34be85f976b8457384bab7347344c5c0.png –

+0

@Frank、私を助けてくれますか? –

答えて

1

よしまず、私はなぜあなたが使用しているのかわかりませんAuthStateListener 内部のコードを削除onStartonStoponCreate この

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

     } 
    }); 
} 

ポストであなたのgetExistingUserInfosigninボタンのonClickListener内でこのメソッドを交換し、それが

注それでなければなりません:あなたは、あなた返されたデータで何かをしたい場合データが返された後にonDataChangeの内部で実行する必要があります。

関連する問題