2017-01-19 9 views
1
다음과 같이 내 데이터베이스에 노드에 리스너를 추가하고

를 검색 로그는 테스트를 위해, 로그 인쇄는 다음과 같이중포 기지 데이터베이스 리스너는 잘못된 정보

8월 1일에서 19일까지 : 44 : 57.547 17531-17531/com.firebase.android D/PROFILE : ffggg @ gmailcom 01-19 08 : 44 : 57.547 17531-17531/com.firebase.android D/PROFILE : test22 @ gmailcom 01-19 08 : 45 : 15.446 17531-17531/com.firebase.android D/PROFILE : 8o93lpc5clhrsrst852nfm2g75 01 -19 08 : 45 : 15.446 17531-17531/com.firebase.android D/PROFILE : a18g2u5h525nqthpqsn6askp75 01-19 08 : 45 : 15.448 17531-17531/com.firebase.android D/PROFILE : ffggg @ gmailcom 01-19 08 : 45 : 15 : 4950 17531-17531/com.firebase.android D/PROFILE : test22 @ gmailcom 01-19 08 : 45 : 15.587 17531-17531/com.firebase.android D/PROFILE : 8o93lpc5clhrsrst852nfm2g75 01-19 08 : 45 : 15.587 17531-17531/com.firebase.android D/PROFILE : a18g2u5h525nqthpqsn6askp75 01-19 08 : 45 : 15.588 17531-17531/com.firebase.android D/PROFILE : ffggg @ gmailcom 01-19 08:45 : 15.588 17531-17531/com.firebase .android D/PROFILE : test22 @ gmailcom

지금은 [email protected]의 아이들을 얻어야한다 (그리고 내가 문자열이 null 또는 비어 있지 않은 체크 한) UID가 [email protected]입니다 가정. 그러나 여기에서는 노드가 uID가 아닌 경우 모든 노드를 참조로 가져옵니다 (그러나 자식은 아닙니다). 나는 내가 수천 개의 레코드를 가지고 있다면 불필요한 많은 데이터를 다운로드하기 때문에 이것을 원하지 않는다.

내가 잘못한 일을하고 있습니까? 아니면 Listbase가 firebase에 의해 구현 되었습니까?

업데이트 1

내가 응용 프로그램 서랍에서 응용 프로그램을 열 때 내가 원하는 노드의 올바른 아이를 얻을 것이다. 그러나이 액티비티의 다른 액티비티로 갈 때, 다른 클래스에서 듣고있는 노드에 자식을 추가 한 다음 그 노드에서 수신중인 클래스로 돌아가서 이상한 출력을 얻습니다. 여기

내가 노드에 추가하는 기타 활동에 대한 코드입니다 :

pullNewImage = myDB.getReference("testNode"); 
pullNewImage.child(uID).child(randomName).setValue(ServerValue.TIMESTAMP); 

업데이트 2

내 업데이트 리스너 코드 :

//global var 

ValueEventListener profileListener = null; 

//.... 

profileListener = ref.child(userEmail).addValueEventListener(new ValueEventListener() { 
        @Override 
        public void onDataChange(DataSnapshot dataSnapshot) { 
         for (DataSnapshot singleSnapshot : dataSnapshot.getChildren()){ 
          Log.d("PROFILE", singleSnapshot.getKey()); 
         } 
        } 

        @Override 
        public void onCancelled(DatabaseError databaseError) {} 
       }); 


//... 
@Override 
     public void onStop() { 
      super.onStop(); 
      if (mAuthListener != null) { 
       auth.removeAuthStateListener(mAuthListener); 
      } 
      if(profileListener != null) 
       ref.removeEventListener(profileListener); 

     } 

답변

1

사용 ref = myDB.getReference("testNode").child(uID);

편집 :

활동을 변경할 때 문제가 발생한다고 말하면서 청취자를 멈추지 않을 수도 있습니다.

ValueEventListener를 추가하십시오 : ValueEventListener profileListener = null; 그리고 스레드를 제거하십시오.

@Override 
public void onStop() { 
    super.onStop(); 

    if(profileListener != null) 
     ref.removeEventListener(profileListener); 
} 

편집 2 :

profileListener = ref.addValueEventListener(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
    for (DataSnapshot singleSnapshot : dataSnapshot.getChildren()){ 
     Log.d("PROFILE", singleSnapshot.getKey()); 
    } 
} 

@Override 
public void onCancelled(DatabaseError databaseError) {} 
}); 

는 그 다음 onStop() 방법 오버라이드 (override) : 그런 다음 ValueEventListener에 리스너를 설정 여전히

확실하지 위가 작동하지 않는 이유를, 그러나 당신은 또한 제공 할 수 있습니다 this shot :

다음은 다음과 같음을 가정합니다. DatabaseReference ref = FirebaseDatabase.getInstance().getReference("testNode");

Query profileQ = ref.orderByKey().equalTo(userEmail); 
profileQ.addValueEventListener(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
    for (DataSnapshot singleSnapshot : dataSnapshot.getChildren()){ 
     Log.d("PROFILE", singleSnapshot.getKey()); 
    } 
} 

@Override 
public void onCancelled(DatabaseError databaseError) {} 
}); 

작동하는 경우 ValueEventListener를 Queue (ValueEventListener에서 상속 된 대기열)로 바꾸어야합니다. UID를 다루기 때문에, 하나만 리턴 할 것입니다 ...하지만 다른 메소드가 작동하지 않는 한 이것이 작동한다면 놀랄 것입니다. 당신이 원하는 경우

ref = myDB.getReference().child("testnode"); 

또는

ref = mDB.getReference("testnode"); 

과 :

ref.addListenerForSingleValueEvent(
        new ValueEventListener() { 
         @Override 
         public void onDataChange(DataSnapshot dataSnapshot) { 
    }}); 
+0

나는 이미 시도했다 코드에서 사용하지 않도록 설정, 동기화되지 않습니다 그냥 다시 시도해 보았습니다. 작동하지 않습니다. 응용 프로그램을 시작하면 올바른 노드 아래의 자식이 인쇄되고 원하는만큼 아무것도 인쇄되지 않습니다. 그 때 나는 다른 액티비티의 노드에 위의 블록 인용문에서 언급 한 이상한 결과를 얻는다. – TerribleCoderSad

+0

왜 스레드에 리스너가 있는가? 리스너는 Async ..를 실행합니다. 다른 이유가 없다면 제거 할 수 있습니다. –

+0

또한 변경 사항을 계속 수신하거나 데이터를 한 번만 가져오고 싶습니까? –

0

는 다음을 사용하여 데이터를 하나의 샷을 검색하려면 "addValueEventListener"를 사용하는 것만 노드를 청취하고, 그렇지 않으면 "addListenerForSingleValue 행사".

및 자식 노드를 참조하도록 수신기를 연결하는 코드를 변경하십시오. 중포 기지에서

ref.child(uid).addValueEventListener(new ValueEventListener() { 
       @Override 
       public void onDataChange(DataSnapshot dataSnapshot) { 
        for (DataSnapshot singleSnapshot : dataSnapshot.getChildren()){ 
         Log.d("PROFILE", singleSnapshot.getKey()); 
        } 
       } 

       @Override 
       public void onCancelled(DatabaseError databaseError) {} 
      }); 
+0

내가 듣는 것이 중요하기 때문에 이것은 선택 사항이 아니다. – TerribleCoderSad

0

시도는이 같은 기준 및 수신기를 변경 :

0

데이터, 당신은 지속성 모드를 사용하도록 설정 한 경우,

FirebaseDatabase.getInstance().setPersistenceEnabled(false);

Firebase Offline Capabilities

관련 문제