目前我创建了一个Listing对象并在其中存储了一堆字段。我需要存储的两个字段是当前用户的电子邮件和名称。我想把这两个字段改为如下
dbRef = database.getReference().child("Users").child(emailKey);
dbRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
UserInfo userIn = dataSnapshot.getValue(UserInfo.class);
email1 = userIn.email;
sellerName = userIn.username;
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
在这段代码之后我有了一行
DatabaseReference temp = dbRefL.push();
temp.setValue(l);
我按下按钮调用所有这些代码。我第一次按下按钮时,整个Listing对象就按照我想要的方式推送到Firebase除了用户电子邮件和用户名不在那里因为它们是空白的。我第二次按下按钮,字符串就在我想要的地方。
我的猜测是因为OnDataChange仅在我推送Listing对象后执行。这是真的?在推送列表对象之前,如何让OnDataChange执行?
答案 0 :(得分:0)
侦听器onDataChange()
回调是异步的。您的电子邮件和用户名为空的原因是onDataChange
尚未执行,以确保在检索到电子邮件和用户名后推送数据,请将代码放入onDataChange()
dbRef = database.getReference().child("Users").child(emailKey);
dbRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
UserInfo userIn = dataSnapshot.getValue(UserInfo.class);
email1 = userIn.email;
sellerName = userIn.username;
//set up your l value
DatabaseReference temp = dbRefL.push();
temp.setValue(l);
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
按下上面的按钮后,应调用代码获取电子邮件和用户名,然后根据需要推送数据。
答案 1 :(得分:0)
用户addValueEvenListener,如:
DatabaseReference map = database.getReference("field_name");
map.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
String data = (String) dataSnapshot.getValue();
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
****OR using****
database.getReference("field_name").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Log.e(TAG, "Field data", dataSnapshot.getValue(String.class));
}
@Override
public void onCancelled(DatabaseError databaseError) {
// Failed to read value
Log.e(TAG, "Failed to read user", databaseError.toException());
}
});