【问题标题】:SingleValueEventListener do not get the value after button click单击按钮后单个 ValueEventListener 未获取值
【发布时间】:2019-06-01 18:35:24
【问题描述】:

单击按钮后,我需要从 Firebase 实时数据库中获取昵称值。所以我在按钮的onClick 方法中创建了singleValueListner()。但它不起作用。

我试过调试它,但代码没有进入singleValueEventListener()

Button getName = (Button)findViewById(R.id.getName);

getName.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        DatabaseReference db = FirebaseDatabase.getInstance().getReference().child("Member").child(user.getUid());
        db.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                for (DataSnapshot data : dataSnapshot.getChildren()) {
                    TextView tv = (TextView)findViewById(R.id.tv);
                    tv.setText(data.child("nickname").getValue().toString());
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });
    }
});

数据库 JSON 结构:

{
  "Member" : {
    "1Zuv6VZZ0kPluwc33f1QQQ7DZD93" /* UID */ : {
      "-LgIHwiAjfuh5pjK7wzl" : {
        "actualScore" : 0,
        "bestScore" : 0,
        "email" : "some@email.com",
        "nickname" : "Vitek",
        "season" : 0
      }
    }
  }
}

数据库结构: https://drive.google.com/file/d/15B4b6Rb_WAiS6fioI9gItyijrbDiVjzJ/view

我需要得到昵称,我认为这写得很好,但不是。那么,有什么问题呢?

【问题讨论】:

  • 您在问题中包含了指向 JSON 树图片的链接。请将其替换为实际的 JSON 作为文本,您可以通过单击 your Firebase Database console 的溢出菜单 (⠇) 中的 Export JSON 链接轻松获得。将 JSON 作为文本使其可搜索,让我们可以轻松地使用它来测试您的实际数据并在我们的答案中使用它,一般来说这只是一件好事。
  • 第一步是停止忽略错误并实施onCancelled。最小实现是:public void onCancelled(@NonNull DatabaseError databaseError) { throw databaseError.toException(); }
  • @FrankvanPuffelen okey

标签: java android database firebase firebase-realtime-database


【解决方案1】:

要获取nickname 属性的值,请使用以下代码行:

String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference uidRef = rootRef.child("Member").child(uid);
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        String nickname = dataSnapshot.child("nickname").getValue(String.class);
        Log.d(TAG, nickname);
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        Log.d(TAG, databaseError.getMessage()); //Don't ignore errors!
    }
};
uidRef.addListenerForSingleValueEvent(valueEventListener);

您的 logcat 中的输出将是:

Vitek

因此无需遍历DataSnapshot 对象即可获取nickname 属性的值。如果没有得到这个结果,请检查 logcat 看是否打印出错误信息。

【讨论】:

    【解决方案2】:

    您只引用了用户的 id,但还有一个用户详细信息的父键,您需要参考。

    tv.setText(data.child("LgiH------").child("nickname").getValue().toString());
    

    但请尝试从您的注册用户代码中删除第二个密钥,因为它没有帮助。

    【讨论】:

      【解决方案3】:

      您在引用 Firebase 根节点时犯了一个错误。只需如下更改您的行:

      DatabaseReference db = FirebaseDatabase.getInstance().getReference("Member");
      

      现在,只需调用您的单值事件。

      db.addListenerForSingleValueEvent(new ValueEventListener() {
                  @Override
                  public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                      for (DataSnapshot data : dataSnapshot.getChildren()) {
                          TextView tv = (TextView)findViewById(R.id.tv);
                          tv.setText(data.child("nickname").getValue().toString());
                      }
                  }
      
                  @Override
                  public void onCancelled(@NonNull DatabaseError databaseError) {
      
                  }
              });
      

      这会做你的事情。尝试使用日志逐步调试您的代码。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-08
        • 2021-12-10
        • 1970-01-01
        • 1970-01-01
        • 2021-02-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多