Android 在Firebase数据库的警报对话框中显示用户数据
当用户的个人资料被点击时,我试图在警报对话框中显示用户的信息。我能够在单击时显示对话框,但对话框为空。用户数据存储在Firebase实时数据库中。Iv发布了Im使用的代码,并在代码中添加了注释。我猜问题是数据库引用还是DataSnapshotAndroid 在Firebase数据库的警报对话框中显示用户数据,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,当用户的个人资料被点击时,我试图在警报对话框中显示用户的信息。我能够在单击时显示对话框,但对话框为空。用户数据存储在Firebase实时数据库中。Iv发布了Im使用的代码,并在代码中添加了注释。我猜问题是数据库引用还是DataSnapshot //Variables usersDb = FirebaseDatabase.getInstance().getReference().child("Users"); mAuth = FirebaseAuth.getInstance
//Variables
usersDb = FirebaseDatabase.getInstance().getReference().child("Users");
mAuth = FirebaseAuth.getInstance();
currentUId = mAuth.getCurrentUser().getUid();
// OnItemClickListener
flingContainer.setOnItemClickListener(new SwipeFlingAdapterView.OnItemClickListener() {
@Override
public void onItemClicked(int itemPosition, Object dataObject) {
// users profile card
cards obj = (cards) dataObject;
final String userId = obj.getUserId();
final AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
DatabaseReference userbio = usersDb.child(userId).child("Bio");
userbio.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()){
if (dataSnapshot.child(userId).child("Bio").getValue() != null){
userBio = dataSnapshot.child("Bio").getValue().toString();
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
builder.setTitle("Bio");
builder.setMessage(userBio);
// Set click listener for alert dialog buttons
DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
switch(which){
case DialogInterface.BUTTON_POSITIVE:
// User clicked the Yes button
break;
case DialogInterface.BUTTON_NEGATIVE:
// User clicked the No button
break;
}
}
};
// Set the alert dialog yes button click listener
builder.setPositiveButton("Yes", dialogClickListener);
// Set the alert dialog no button click listener
builder.setNegativeButton("No",dialogClickListener);
AlertDialog dialog = builder.create();
// Display the alert dialog on interface
dialog.show();
}
}); }
我解决了这个问题。我在下面添加了正确的代码
DatabaseReference databaseReference = usersDb.child(userId);
databaseReference.addValueEventListener(new ValueEventListener()
{
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot)
{
if (dataSnapshot.exists()) {
if (dataSnapshot.child("Bio").getValue() != null) {
userBio = dataSnapshot.child("Bio").getValue().toString();
}
}}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
final AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setTitle("Bio");
builder.setMessage(userBio);
可能是因为您调用了两次
child(“Bio”)
,首先是在DatabaseReference中,然后是在DataSnapshot中。尝试从其中一个中删除它。这不起作用。从引用中删除子项会导致崩溃,而从DataSnapshot中删除子项只会显示一个空警报对话框。您可以发布Firebase数据库结构的图片,说明您要获取的数据吗?我添加了数据库的屏幕截图。实际上,您是对的。在从数据库引用中删除子项并稍微更改代码后,我让它开始工作。太棒了!我很高兴它成功了!请将您的数据库结构添加为JSON文件或至少一个屏幕截图。好的,我添加了我的数据库的屏幕截图。还请扩展这些封闭对象中的内容。我会做的!我发布了另一个屏幕截图,对象已展开。我现在看到了。问题是您不能在回调之外简单地使用userBio
,因为该属性的值尚未加载。请检查副本以了解为什么会出现这种行为,以及如何使用自定义回调解决此问题。