在我的应用程序中,我有一个id应该从firebase实时数据库中下载。如果我把它拉下来并且它看到没有可用的id,那么它将id设置为1.我做了一个调试,并且id设置为1,但是在监听器完成之后,id变为0.我不知道#39;不知道为什么或导致这种情况的原因,但这是我的代码。
听众代码:
userRef.child("id").
addSingleValueEventListener(new ValueEventListener() {
@Override public void onDataChange (DataSnapshot dataSnapshot){
try {
String value = dataSnapshot.getValue().toString();
id = Integer.parseInt(value);
} catch (NullPointerException e) {
id = 1; //After this, id is 1
e.printStackTrace();
}
}
@Override public void onCancelled (DatabaseError databaseError){
id = 1;
}
}); //Now id is 0
答案 0 :(得分:6)
这个问题有两个问题,一个关于Firebase监听器,第二个关于删除多余的代码。
Firebase侦听器的一个基本要素是它们是异步,这意味着您的代码在执行下一行之前不会等待结果。请查看此框架代码中的注释:
userRef.child("id").
addSingleValueEventListener(new ValueEventListener() {
@Override public void onDataChange (DataSnapshot dataSnapshot){
// code here does not get executed straight away,
// it gets executed whenever data is received back from the remote database
}
@Override public void onCancelled (DatabaseError databaseError){
}
});
// if you have a line of code here immediately after adding the listener
// the onDataChange code *won't have run*. You go straight to these lines
// of code, the onDataChange method will run whenever it's ready.
所以这意味着如果你想对onDataChange
中的数据做些什么,你应该把这些代码放在onDataChange
方法中(或从那里或其他一些方法调用的其他方法)在数据交付之后运行该代码的方式。)
关于第二部分,稍微更多的 Firebasey 检查是否存在int并获取值的方法是:
@Override public void onDataChange (DataSnapshot dataSnapshot){
if (dataSnapshot.exists()) {
id = dataSnapshot.getValue(Integer.class);
} else {
id = 1;
}
}
答案 1 :(得分:0)
你需要使用setValue()将id = 1设置到firebase数据库中,尝试下面的代码行可以帮助你
userRef.child("id").
addSingleValueEventListener(new ValueEventListener() {
@Override public void onDataChange (DataSnapshot dataSnapshot){
try {
String value = dataSnapshot.getValue().toString();
id = Integer.parseInt(value);
} catch (NullPointerException e) {
// if id=0 then set id=1 using setvalue()
// this will set value of Id =1 in firebase database
id=1;
userRef.child("id").setValue(id);
log.d(LOG_TAG, e.printStackTrace());
}
}
@Override public void onCancelled (DatabaseError databaseError){
id=1;
userRef.child("id").setValue(id);
}
});
答案 2 :(得分:0)
从FireBase实时数据库中取出对象时,我遇到了同样的问题, 就像@Lewis McGeary所写的那样,我只是让我的程序等待,直到从数据库中检索了所有数据
这是我的示例代码:
BarReference = FirebaseDatabase.getInstance().getReference("Users").child(myUID);
ValueEventListener UserChangeListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
me = dataSnapshot.getValue(UserDataSet.class);
}
@Override
public void onCancelled(DatabaseError databaseError) {
Log.w(TAG, "loadPost:onCancelled", databaseError.toException());
}
};
BarReference.addValueEventListener(UserChangeListener);
while (me == null){
Log.w(TAG, "Waiting For The Data to Download");
progresBar.setVisibility(View.VISIBLE);
return;
}
希望有帮助! (^_^)