簡體   English   中英

單擊按鈕后,SingleValueEventListener不會獲取值

[英]SingleValueEventListener do not get the value after button click

單擊按鈕后,我需要從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

我需要得到昵稱,我認為這寫得很好,但不是。 那么,有什么不對?

您只是引用用戶的ID,但您還需要引用用戶詳細信息的父鍵。

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

但是嘗試從注冊用戶的代碼中刪除第二個密鑰,因為它沒有幫助。

您在引用firebase根節點時犯了一個錯誤。 只需更改您的行,如下所示:

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

現在,只需調用您的singlevalue事件。

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) {

            }
        });

這將做你的事情。 嘗試一步一步地使用日志調試代碼。

要獲取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以查看是否打印出錯誤消息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM