【问题标题】:How to retrieve data from Firebase to show in TextView? [closed]如何从 Firebase 检索数据以在 TextView 中显示? [关闭]
【发布时间】:2019-02-07 16:47:56
【问题描述】:

我的 firebase 数据库结构如下所示:

我正在使用此代码,但它不会从数据库中检索任何数据,有时getUid() 会产生 NullPointerException。谁能帮我解决这个问题?

mAuth = FirebaseAuth.getInstance();

mUser = mAuth.getCurrentUser();

userID = mUser.getUid();

mDatabaseReference = FirebaseDatabase.getInstance().getReference().child("Users");

mDatabaseReference.addValueEventListener(new ValueEventListener() {

    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        showData(dataSnapshot);
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
});

private void showData(DataSnapshot dataSnapshot) {
    for (DataSnapshot ds: dataSnapshot.getChildren()) {
        UserInformation uInfo = new UserInformation();
        uInfo.setFullName(ds.child(userID).getValue(UserInformation.class).getFullName());
        uInfo.setUsername(ds.child(userID).getValue(UserInformation.class).getUsername());
        uInfo.setEmail(ds.child(userID).getValue(UserInformation.class).getEmail());
        
        fullNameProfile.setText(uInfo.getFullName());
        usernameProfile.setText(uInfo.getUsername());
        emailProfile.setText(uInfo.getEmail());
    }
}

【问题讨论】:

    标签: java android firebase firebase-realtime-database


    【解决方案1】:

    要简单地从数据库中获取用户数据,请使用以下代码行:

    String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
    
    DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
    DatabaseReference uidRef = rootRef.child("Users").child(uid);
    ValueEventListener valueEventListener = new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            String email = dataSnapshot.child("Email").getValue(String.class);
            String fullName = dataSnapshot.child("FullName").getValue(String.class);
            String password = dataSnapshot.child("Password").getValue(String.class);
            String userName = dataSnapshot.child("Username").getValue(String.class);
            Log.d(TAG, userName);
        }
    
        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            Log.d(TAG, databaseError.getMessage()); //Don't ignore errors!
        }
    };
    uidRef.addListenerForSingleValueEvent(valueEventListener);
    

    使用UserInformation 类甚至更简单:

    DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
    DatabaseReference uidRef = rootRef.child("Users").child(uid);
    ValueEventListener valueEventListener = new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            UserInformation uInfo = dataSnapshot.getValue(UserInformation.class);
            Log.d(TAG, uInfo.getUsername());
        }
    
        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            Log.d(TAG, databaseError.getMessage()); //Don't ignore errors!
        }
    };
    uidRef.addListenerForSingleValueEvent(valueEventListener);
    

    【讨论】:

    • 我尝试了您的解决方案,但它对我不起作用。你能给我一个完美的解决方案来从我的数据库结构中指定的全名、用户名和电子邮件等 firebase 中检索所有数据吗?
    • 我们就用第一种方案,既然如此,为什么说不行呢?你有错误吗?行为是什么?另请参阅我编辑的其他属性的答案。这是应该 100% 有效的解决方案,对吧?
    • 它没有产生任何错误。我使用这两种解决方案,但它没有从数据库中获取数据。它在日志中没有显示任何内容。如果你说我会给你我的代码的 github 链接。
    • onDataChange 方法甚至被触发了吗?如果您在其中添加一条日志语句 (Log.d(TAG, "Test!!!!!");),它会打印一些内容吗?
    • 不,它没有触发。
    猜你喜欢
    • 2022-01-23
    • 1970-01-01
    • 2019-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-26
    • 2012-08-31
    相关资源
    最近更新 更多