过去5天,我一直试图从我的firebase数据库中检索数据字段,但没有成功。这就是我的数据库的样子:
获取数据的代码:
private void alterTextView(final String id) {
if(id!=null) {
mDatabase.child("Users").child(id).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
UserInformation userInformation = dataSnapshot.getValue(UserInformation.class);
String name = (String) userInformation.getName();
Log.d("Main Activity",name);
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
mWelcomeUserMessage.setText("Welcome, "+name);
}
}`
我不知道为什么这个名字是'null'(参考log)。 有人能告诉我我做错了吗?
PS:我在UserInformation.java类中定义了一个空白的默认构造函数,getter和setter。
此外,mDatabase初始化如下:
mDatabase = FirebaseDatabase.getInstance().getReference();
答案 0 :(得分:2)
dataSnapshot.getValue(Class)
只会将值加载并设置为公共字段。我发现你已经有了一个默认的构造函数。
将UserInformation类中的名称字段设为public。还要确保您调用getValue的快照是UserInformation类的有效JSON表示,并且具有完全相同的" name"字段(它必须与类中的名称字段完全匹配)。
请注意:
addValueEventListener
添加了一个侦听器,当数据可用时将调用该侦听器。
请注意,调用onDataChange
后数据可用。这就是为什么在从DataSnapshot
获取所需数据后应立即设置文本的原因。像那样:
private void alterTextView(final String id) {
if(id!=null) {
mDatabase.child("Users").child(id).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
UserInformation userInformation = dataSnapshot.getValue(UserInformation.class);
String name = (String) userInformation.getName();
Log.d("Main Activity",name);
runOnUiThread(new Runnable() {
@Override
public void run(){
mWelcomeUserMessage.setText("Welcome, "+name);
}
});
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
}