我尝试从Firebase数据库中获取单个记录,并将其转换为 Kategori
类中的对象,由 id_kategor
'属性决定。< / p>
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);
}
}
我希望所有属性都可以从Firebase获得正确的值。
带有 CHECK 1
标记的日志会显示正确的结果,这意味着从Firebase成功获取其值。
但是标记为 CHECK 2
的日志会给我带来运行时错误*"java.lang.NullPointerException: println needs a message"*
,这意味着**'nama_en'**
属性的值为*null*
,这也意味着attribut失败从Firebase ValueEventListener
究竟是什么问题?
这是我的数据样本
答案 0 :(得分:1)
检查2 可能会在检查1 之前运行,特别是在nama_en
初始化之前。
这里的要点是addListenerForSingleValueEvent
将内部类添加为侦听器,但它不会立即执行其中的代码。而是直接继续使用 Check 2 调试语句
特别是name_en
已初始化onDataChange
,因此调用该方法时,应该在更改任何数据时发生(我不熟悉Firebase API)。
您可以通过立即激活两个调试语句并使用String.valueOf(Object o)
来检查此行为,这样您就不会遇到NPE,但仍会看到null
值。