【问题标题】:Trying to retrieve data from Firebase but getting null尝试从 Firebase 检索数据但获得空值
【发布时间】:2019-10-20 22:37:57
【问题描述】:

我正在尝试从我的 firebase 数据库中检索数据并在文本字段中打印一条语句,但我不断收到空值。我正在使用userid 尝试访问我想要的子节点。我的文本框一直说“欢迎 null 以 null 身份登录”My Firebase Database

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_welcome);
        final String uid;
        FirebaseUser user;


        user = FirebaseAuth.getInstance().getCurrentUser();
        uid = user.getUid();

        DatabaseReference reference = 
      FirebaseDatabase.getInstance().getReference("User");


         reference.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                fName = dataSnapshot.child(uid).child("fName").getValue(String.class);
                role = dataSnapshot.child(uid).child("role").getValue(String.class);

            }
            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });

        welcomeText = (TextView) findViewById(R.id.welcomeText);
        welcomeText.setText("Welcome " + fName + "! You are logged-in as " + role);

【问题讨论】:

  • 您是否进行了调试以查看dataSnapshot 中的确切内容?你的回调是否被调用?
  • 如果您在 DataSnapshot 中获得正确的数据,则在 onDataChanged() 中移动此行 welcomeText.setText("Welcome " + fName + "!您以 " + role) 身份登录。
  • 您很可能受到从 Firebase 加载数据的异步性质的影响,并且您的 welcomeText.setText(...) 在调用 onDataChange 之前执行。有关更多详细信息和示例,请在此处查看我的答案:stackoverflow.com/questions/50434836/…

标签: java android firebase firebase-realtime-database


【解决方案1】:

将以下行移至 onDataChange() 回调方法。

welcomeText = (TextView) findViewById(R.id.welcomeText);
welcomeText.setText("Welcome " + fName + "! You are logged-in as " + role);

【讨论】:

  • 谢谢,我这样做了,但我仍然得到空值
  • 没关系。万事如意
  • 请记住在你给出答案时解释为什么,给出一个有效的答案是一回事,但其他人不会从中吸取教训,友情提示:)
【解决方案2】:

您应该将您的userid 作为孩子传递,以便仅为登录用户获取数据。目前,您遍历所有最终给您错误数据的用户。 尝试如下:

DatabaseReference reference = 
      FirebaseDatabase.getInstance().getReference("User").child(uid);

而不是

DatabaseReference reference = 
      FirebaseDatabase.getInstance().getReference("User");

除此之外,目前您正在设置fNamerole 的初始值,它们为空,并且永远不会使用您在onDataChange 中获得的用户详细信息更新该值。所以,在onDataChange 中更新你的TextView

@Override
public void onDataChange(DataSnapshot dataSnapshot) {
    fName = dataSnapshot.child("fName").getValue(String.class);
    role = dataSnapshot.child("role").getValue(String.class);

    welcomeText.setText("Welcome " + fName + "! You are logged-in as " + role);
}

【讨论】:

  • 谢谢,我这样做了,但我仍然得到空值
  • 你是如何解决这个问题的?
猜你喜欢
  • 2022-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-24
  • 2017-04-03
  • 2019-04-13
  • 2018-09-18
  • 1970-01-01
相关资源
最近更新 更多