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
전에 실행될 수 있습니다 내 데이터 샘플
다시 firebase 데이터를 확인해 주시겠습니까? null을 반환하는 en 필드이므로 en이 숫자 또는 다른 데이터 유형 인 경우 firebase가이를 인식하도록 ""따옴표를 추가하십시오. 문자열 –
답장을 보내 주셔서 감사합니다. 그러나 'CHECK 1'로그가 정확한 결과를 데이터베이스에 제공하기 때문에 Firebase 데이터에 아무런 문제가 없다고 생각합니다. 또한 내 데이터 ID는 영숫자를 사용하고 알파벳으로 시작합니다. 필자는 Firebase에 내 데이터 샘플의 스크린 샷을 제 질문에 추가했습니다. –
Izruo는 예상 된 동작이라고 설명 했으므로 데이터는 Firebase (그리고 대부분의 최신 웹)에서 비동기 적으로로드되고'onDataChange' 메소드는'check 2'가 로그 된 후 오랫동안 호출되고 함수는'fetchData'를 리턴합니다. 해결책은 Firebase *의 데이터가 필요한 코드를 * onDataChange (또는 거기에서 호출)로 이동하는 것입니다. 자세한 설명은 https://stackoverflow.com/q/33203379, https://stackoverflow.com/q/42596777 및 https://stackoverflow.com/q/31700830을 참조하십시오. –