Android中未检索Firebase用户详细信息

时间:2017-06-25 19:31:04

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

我在UserNode中存储用户详细信息'firstname'和'lastname'。但是当我想要检索那些细节时,没有数据被检索。我在互联网上尝试了几乎所有解决方案,但没有解决我的问题。这是我检索当前用户数据的代码:

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

        }
    });

Here is the structure of database] 1

请帮帮我,我被困住了

3 个答案:

答案 0 :(得分:0)

请阅读how to retrieve data from firebase。我认为你有一个问题,因为你没有类模型

您的步骤:

  1. 使用firstname和lastname字段创建模型UserModel
  2. 使用监听器(来自docs的示例):

    // 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());
        }
    });
    
  3. 请参阅其他答案:How to retrieve data from one single userID Firebase Androidretrieving data from firebase android

答案 1 :(得分:0)

使用 FirebaseUser

FirebaseUser实施UserInfo并在UserInfo的{​​{3}}文档中说明

  

返回用户的显示名称(如果有)

因此,如果未设置显示名称,getDisplayName()可能会返回null。在这种情况下,FirebaseUser.getDisplayName()收到null作为消息,因此打印 println需要一条消息

使用您自己的结构:

使用Log.e()代替使用类型转换,而不是:

String acctname = dataSnapshot.child("firstname").getValue(String.class);

答案 2 :(得分:0)

您正在阅读ValueEventListener的用户集合。由于[使用值事件读取列表的Firebase文档](侦听值事件)说明:

  

虽然建议使用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
    }
});