在 Android 中未检索 Firebase 用户详细信息
Posted
技术标签:
【中文标题】在 Android 中未检索 Firebase 用户详细信息【英文标题】:Firebase user details are not retrieved in Android 【发布时间】:2017-06-25 19:31:03 【问题描述】:我在 UserNode 中存储用户详细信息“名字”和“姓氏”。但是,当我想检索该详细信息时,则不会检索任何数据。我尝试了互联网上几乎所有的解决方案,但没有解决我的问题。这是我检索当前用户数据的代码:
FirebaseUser userr = FirebaseAuth.getInstance().getCurrentUser();
if (userr != null)
String name = userr.getDisplayName();
Log.e("value", name);
但它说“println 需要一条消息”
我也试过了,但什么也没发生:
DatabaseReference DataRef;
DataRef = FirebaseDatabase.getInstance().getReference().child("UserNode");
DataRef.addValueEventListener(new ValueEventListener()
@Override
public void onDataChange(DataSnapshot dataSnapshot)
String acctname = (String)dataSnapshot.child("firstname").getValue();
Log.e("name", acctname);
@Override
public void onCancelled(DatabaseError databaseError)
);
]1
请帮帮我,我被它困住了
【问题讨论】:
是的,先生 @Tomas 等一下,我要编辑帖子 @Tomas 我已经更新了代码,请检查 “我在 UserNode 中存储用户详细信息 'firstname' 和 'lastname'” - 您共享的代码没有显示这一点。请更新您的问题以包含minimum, complete code that reproduces the problem(阅读链接 - 虽然很长,但它非常有用)。还要更新您的问题以包含 JSON 作为文本,而不是图像链接。您可以通过单击Firebase Database console 中的“导出 JSON”链接来获取此信息。 【参考方案1】:您正在阅读具有ValueEventListener
的用户集合。正如 [Firebase documentation for reading lists with a value event](Listen for value events) 解释的那样:
虽然使用
ChildEventListener
是读取数据列表的推荐方法,但在某些情况下将ValueEventListener
附加到列表引用很有用。将
ValueEventListener
附加到数据列表会将整个数据列表作为单个DataSnapshot
返回,然后您可以循环访问单个子级。即使只有一个[子节点],快照仍然是一个列表;它只包含一个项目。要访问该项目,您需要遍历结果。
所以在你的代码中:
DatabaseReference DataRef;
DataRef = FirebaseDatabase.getInstance().getReference().child("UserNode");
DataRef.addValueEventListener(new ValueEventListener()
@Override
public void onDataChange(DataSnapshot dataSnapshot)
for (DataSnapshot childSnapshot: dataSnapshot.getChildren())
String acctname = (String)childSnapshot.child("firstname").getValue();
Log.i("name", acctname);
@Override
public void onCancelled(DatabaseError databaseError)
throw databaseError.toException(); // don't ignore errors
);
【讨论】:
谢谢你的回答,很抱歉迟到的回复,getChildren() 爵士给出错误并显示红线,它说“非静态方法 getChildren 不能从静态上下文中引用。怎么办这个案子? 糟糕...这是一个错字:DataSnapshot.getChildren()
-> dataSnapshot.getChildren()
。固定。
还是同样的问题,:( println 需要留言
还有另一种类型。很抱歉,有时复制/粘贴/修改会出错。但我不确定你对 println 的意思,因为我的回答中没有这样的调用。
我从 3 天开始一直试图解决这个问题,但没有人给我正确的答案。但你是天才。谢谢它的工作非常感谢您的帮助:) 最后一件事,它显示了 UserNode 数据的所有名字。如何仅显示登录的当前用户名【参考方案2】:
使用 FirebaseUser
:
FirebaseUser
实现了UserInfo
并在UserInfo
的getDisplayName()
文档中说
返回用户的显示名称,如果可用。
因此,当未设置显示名称时,FirebaseUser.getDisplayName()
可能会返回 null
。在这种情况下,Log.e()
接收 null
作为消息,因此打印 println 需要消息
使用您自己的结构:
不要使用类型转换,而是像这样使用getValue(Class<T>)
:
String acctname = dataSnapshot.child("firstname").getValue(String.class);
【讨论】:
你的意思是println needs a message
尝试 System.out.println() 而不是 Log.e() 并评论输出
我是否需要像开发人员在此解决方案上方的解决方案中所说的那样创建一些类。请检查
当String name = userr.getDisplayName();
中的name
为空时,会出现错误println needs a message
。您的用户可能缺少显示名称。
我的名字和姓氏不是用户显示名?【参考方案3】:
请阅读how to retrieve data from firebase。我认为您有问题,因为您没有类模型。
你的步骤:
-
使用名字和姓氏字段创建模型 UserModel
使用监听器(来自文档的示例):
// Attach a listener to read the data at our posts reference
ref.addValueEventListener(new ValueEventListener()
@Override
public void onDataChange(DataSnapshot dataSnapshot)
Post post = dataSnapshot.getValue(Post.class);
System.out.println(post);
@Override
public void onCancelled(DatabaseError databaseError)
System.out.println("The read failed: " + databaseError.getCode());
);
查看其他答案:How to retrieve data from one single userID Firebase android 和 retrieving data from firebase android
【讨论】:
推荐使用 Java 类来表示数据,但不是必需的。在 Arslan 的代码中,dataSnapshot.child("firstname").getValue()
将获取快照的 firstname
属性,然后将该值作为其原生底层类型返回(可能是 String
给定属性名称)。以上是关于在 Android 中未检索 Firebase 用户详细信息的主要内容,如果未能解决你的问题,请参考以下文章
如何从firebase数据库检索经度和经度到android地图应用程序