【问题标题】:How to retrieve user data of authenticated users in Firebase Realtime Database with Android如何使用 Android 在 Firebase 实时数据库中检索经过身份验证的用户的用户数据
【发布时间】:2020-04-25 15:30:37
【问题描述】:

我正在尝试从 Firebase 实时数据库中检索当前登录用户的个人资料数据。我已经使用电子邮件和密码验证了我的用户。然后我将注册数据保存在数据库中,作为一个对象如下:(所有这些代码都是在 SignUpActivity 中的 onCreate)。我将数据保存为 User 对象。我的 User 模型类有 getter 和 setter、参数化和空白构造函数。

´´´´// Initialize FirebaseAuth and DatabaseReference
mFirebaseAuth = FirebaseAuth.getInstance();
mDatabaseRef = FirebaseDatabase.getInstance().getReference("users");

mFirebaseAuth.createUserWithEmailAndPassword(email, password)
        .addOnCompleteListener(SignUpActivity.this, new OnCompleteListener<AuthResult>() {
            @Override
            public void onComplete(@NonNull Task<AuthResult> task) {
                if (task.isSuccessful()) {

                    //save all data to database

                   String mUserId = mFirebaseAuth.getCurrentUser().getUid();

                        User user = new User(email, name,tel, address1,address2,user_type, mUserId);

                        //add to database
                        mDatabaseRef.child(mUserId).setValue(user);
//open main activity
Intent intent = new Intent(SignUpActivity.this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);

因此,mUserId 是经过身份验证的用户的 userId。我的数据库结构如下,规则默认public。

wish-store-42facaddclose
    users
        2GbVFSMFrihqVJ8OAXBa56owNW93
            address1: "juja"
            address2:  "Town"
            email:  "a.bea@gmail.com"
            phone:  "+237638256239"
            userId:  "2GbVFSMFrihqVJ8OAXBa56owNW93"
            userName:  "Beatrice Njambi"
            userType:  "Buyer Account"

现在,要在 MainActivity 中检索数据,这是我在 onCreate 中使用的代码:

//instantiate firebaseAuth
mFirebaseAuth = FirebaseAuth.getInstance();

然后onStart;

userName = (TextView) findViewById(R.id.userNameHeader);

//check to see if user is logged in
mFirebaseUser = mFirebaseAuth.getCurrentUser();
if (mFirebaseUser == null) {
    //the user is not logged in, start login activity
    loadLogInView();
} else {


    String mUserId = mFirebaseUser.getUid();

    root = FirebaseDatabase.getInstance().getReference();

    DatabaseReference mDatabaseRef = root.child("users").child(mUserId);

    ValueEventListener profileListener = new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            User user = dataSnapshot.getValue(User.class);
            userName.setText(user.getUserName());
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            Log.i("Read failed", databaseError.getMessage());
        }
    };
    mDatabaseRef.addValueEventListener(profileListener);


}

我曾尝试调试,它说 mUserId 存在空指针异常。因此,问题在于正确引用经过身份验证的用户的 userId。请帮忙,我真的不明白我做错了什么。

提前致谢。

【问题讨论】:

  • SignUpActivity 中获取mUserId
  • 你能添加你的异常日志吗?
  • @prosper K。我可以在signUpActivity中引用它,因为用户对象已成功保存在mUserId节点下。
  • 如果mUserId 为空,则表示您未通过身份验证,对吧?所以请确保您在使用前已通过身份验证。

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


【解决方案1】:
        mAuth = FirebaseAuth.getInstance();
        mAuth.getCurrentUser();

        FirebaseUser mUser = mAuth.getCurrentUser();

        String uId = mUser.getUid();
        String personName=mUser.getDisplayName();
        String personEmail=mUser.getEmail();
        String personPhoto=mUser.getPhotoUrl();



试试这个

【讨论】:

    【解决方案2】:

    尝试直接为数据库对象添加ValueEventListener,而不是稍后再设置。尝试检查您是否已初始化FirebaseAuth

    【讨论】:

      猜你喜欢
      • 2018-01-27
      • 2017-11-15
      • 1970-01-01
      • 1970-01-01
      • 2018-07-15
      • 2019-07-10
      • 2019-09-27
      • 2020-10-04
      • 1970-01-01
      相关资源
      最近更新 更多