2017-12-03 12 views
-1

에서 값을 읽을 수 없습니다.내가 내 중포 기지 데이터베이스에서 하나의 레코드를 얻을하고 <strong><code>id_kategor</code> '</strong> 속성에 의해 결정 <strong><code>Kategori</code></strong> 클래스의 객체로 변환하려고 ValueEventListener 내부 클래스

public class Kategori { 

    private String nama_id; 
    private String nama_en; 
    private String id_kategori; 
    private Integer jml_item = 0; 
    private Integer jml_brand = 0; 

    public Kategori(){} 

    public Kategori(String id_kategori) { 
    this.id_kategori = id_kategori; 
    this.fetchData(); 
    } 

    private void fetchData(){ 
    FirebaseDatabase database = FirebaseDatabase.getInstance(); 
    DatabaseReference myRef = database.getReference("kategori"); 

    myRef.child(this.id_kategori).addListenerForSingleValueEvent(new ValueEventListener(){ 

     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      if(dataSnapshot.exists()){ 
       String nama_en = dataSnapshot.child("nama_en").getValue(String.class); 
       String nama_id = dataSnapshot.child("nama_id").getValue(String.class); 

       Kategori.this.nama_en = nama_en; 
       Kategori.this.nama_id = nama_id; 

       Log.d(">>>>>> CHECK 1 >>>>>",Kategori.this.nama_en); 
      } 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 

    //Log.d(">>>>>> CHECK 2 >>>>>",this.nama_en); 
    } 
} 

나는 모든 속성 중포 기지에서 올바른 값을 얻을 수 있습니다 기대합니다. 태그 CHECK 1

로그가 성공적으로 중포 기지로부터 값을 가져 의미 정확한 결과를 보여줍니다. 태그 CHECK 2와 하지만 로그는 그 속성이 *null* 값을 가지고 **'nama_en'** 의미하며, 또한 attribut이 정확히 문제가 무엇 Firebase ValueEventListener

에서 값의 가져 오지 못했습니다 의미 나 런타임 오류 *"java.lang.NullPointerException: println needs a message"*을 준다?

여기에 초기화 확인 1 특히 이전 nama_en 전에 실행될 수 있습니다 내 데이터 샘플

enter image description here

+0

다시 firebase 데이터를 확인해 주시겠습니까? null을 반환하는 en 필드이므로 en이 숫자 또는 다른 데이터 유형 인 경우 firebase가이를 인식하도록 ""따옴표를 추가하십시오. 문자열 –

+0

답장을 보내 주셔서 감사합니다. 그러나 'CHECK 1'로그가 정확한 결과를 데이터베이스에 제공하기 때문에 Firebase 데이터에 아무런 문제가 없다고 생각합니다. 또한 내 데이터 ID는 영숫자를 사용하고 알파벳으로 시작합니다. 필자는 Firebase에 내 데이터 샘플의 스크린 샷을 제 질문에 추가했습니다. –

+1

Izruo는 예상 된 동작이라고 설명 했으므로 데이터는 Firebase (그리고 대부분의 최신 웹)에서 비동기 적으로로드되고'onDataChange' 메소드는'check 2'가 로그 된 후 오랫동안 호출되고 함수는'fetchData'를 리턴합니다. 해결책은 Firebase *의 데이터가 필요한 코드를 * onDataChange (또는 거기에서 호출)로 이동하는 것입니다. 자세한 설명은 https://stackoverflow.com/q/33203379, https://stackoverflow.com/q/42596777 및 https://stackoverflow.com/q/31700830을 참조하십시오. –

답변

1

확인이입니다.

요점은 addListenerForSingleValueEvent은 내부 클래스를 수신기로 추가하지만 코드에서 즉시 코드를 실행하지 않는다는 점입니다. 대신 직접 확인 2 디버그 문으로 계속됩니다.
특히 name_enonDataChange으로 초기화되므로 메소드가 호출 될 때 어떤 데이터가 변경 되더라도 발생해야합니다 (Firebase API에 익숙하지 않습니다).

디버그 문을 동시에 활성화하고 String.valueOf(Object o)을 사용하여이 동작을 확인할 수 있으므로 NPE로 실행되지 않지만 여전히 null 값이 표시됩니다.

+0

감사합니다. 네, 그렇습니다. ** CHECK 2 **는 ** CHECK 1 ** ** 전에 실행될 수 있습니다. 또한 속성 값을 사용할 때 메소드가 아직 실행되지 않았기 때문에 데이터가 없을 수도 있습니다. 동기식입니다 : ( 결과 데이터를 캡처하고 사용하려면 어디에서 코드를 입력해야합니까? –