[英]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.