【问题标题】:How to store user data using Firebase in Android?如何在 Android 中使用 Firebase 存储用户数据?
【发布时间】:2017-07-29 16:30:36
【问题描述】:

我需要为登录到应用程序的每个用户创建并使用包含所有详细信息(uid、名称等)的数据库条目

我在存储用户数据以便在 Android 中使用 Firebase 使用和检索用户个人资料信息时遇到问题。我在旧版本的 Firebase 上找到了这个 documentation,但这似乎不再起作用了。

有谁知道如何重现上述代码以使其适用于新版本的 Firebase?非常感谢。

编辑 - 下面的代码:

final Firebase ref = new Firebase("https://<YOUR-FIREBASE-APP>.firebaseio.com");
ref.authWithPassword("jenny@example.com", "correcthorsebatterystaple",
new Firebase.AuthResultHandler() {
@Override
public void onAuthenticated(AuthData authData) {
    // Authentication just completed successfully :)
    Map<String, String> map = new HashMap<String, String>();
    map.put("provider", authData.getProvider());
    if(authData.getProviderData().containsKey("displayName")) {
        map.put("displayName", authData.getProviderData().get("displayName").toString());
    }
    ref.child("users").child(authData.getUid()).setValue(map);
}
@Override
public void onAuthenticationError(FirebaseError error) {
    // Something went wrong :(
}
});

【问题讨论】:

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


    【解决方案1】:

    要在 firebase 数据库中创建用户(新版本),您需要进行如下更改..

          private FirebaseAuth mAuth;
            String mUserEmail = "jenny@example.com";
            String mPassword = "correcthorsebatterystaple"
    
          mAuth.createUserWithEmailAndPassword(mUserEmail, mPassword)
         .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
    
                        Log.d(LOG_TAG, getString(R.string.log_message_auth_successful) + " createUserWithEmail:onComplete:" + task.isSuccessful());
    
                        // if task is not successful show error
                        if (!task.isSuccessful()) {
    
                            try {
                                throw task.getException();
                            } catch (FirebaseAuthUserCollisionException e) {
                                // log error here                            
    
                          } catch (FirebaseNetworkException e) {
                                // log error here  
                            } catch (Exception e) {
                             // log error here        
                             }
    
                            } else {
    
                      // successfully user account created
                     // now the AuthStateListener runs the onAuthStateChanged callback
    
                        }
                    }
    
                });
             }
    

    现在在 onCreate() 中添加以下方法。

       final DatabaseReference ref = FirebaseDatabase.getInstance().
         getReferenceFromUrl(https://<YOUR-FIREBASE-APP>.firebaseio.com");
         mAuth = FirebaseAuth.getInstance();
         mAuthListener = new FirebaseAuth.AuthStateListener() {
            @Override
            public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
                FirebaseUser user = firebaseAuth.getCurrentUser();
    
                if (user != null) {
                    // User is signed in
                 Map<String, String> map = new HashMap<String, String>();
                 map.put("provider", user.getProvider());
                 if(user.getProviderData().containsKey("displayName")) {
                 map.put("displayName",  
                 user.getProviderData().get("displayName").toString());
                } 
                ref.child("users").child(user.getUid()).setValue(map);
                } else {
                    // User is signed out
                    Log.d(LOG_TAG, "onAuthStateChanged:signed_out");
                }
            }
        };
    
       @Override
    public void onStart() {
        super.onStart();
        mAuth.addAuthStateListener(mAuthListener);
    }
    
    @Override
    public void onStop() {
        super.onStop();
        if (mAuthListener != null) {
            mAuth.removeAuthStateListener(mAuthListener);
        }
    
    }
    

    【讨论】:

    • 如果您想使用电子邮件和密码登录用户,那么您可以使用 mAuth.signInWithEmailAndPassword(email, password) 方法。
    【解决方案2】:
    • 要使用电子邮件和密码(Google、Facebook)对用户进行身份验证,请使用Firebase Auth
    • 使用 Firebase 数据库存储与使用 Firebase Realtime Database 不同的数据
    • 如果您想从后端管理身份验证用户

    用户管理 - 检索用户的完整数据并更改用户的密码或电子邮件地址 自定义身份验证 - 您可以将外部用户系统与 Firebase 集成。 身份验证 - 使用该服务在您自己的服务器上识别这些用户。

    Firebase Auth 有一个 NODE JS sdk,您可以使用它。如果您想从Android 访问这些功能,则必须创建一个Web 服务(例如Restful API)并通过网络与其通信。

    • 如果您想在实时数据库中访问已注册的 Auth 用户,我认为您无法访问,因为它们彼此分开。您可以在实时数据库中注册用户,但我不明白您为什么要这样做,因为 Auth 以更简单的方式为您提供了此功能。

    • Firebase 实时数据库也有一个 Admin SDK (Java and Node JS)

      请在询问之前检查文档。

    【讨论】:

    • 感谢 Klevi01,我已经拥有身份验证和实时数据库,我需要的是一种访问在应用程序上经过身份验证的用户的方法,我可以在“身份验证”下看到用户列表' Firebase 仪表板的选项卡,但无法通过实时数据库访问它们。我链接的上述文档显示了如何使用旧版本的 Firebase 来实现这一点,但我无法让它与更新的版本一起使用。
    【解决方案3】:

    请使用最新的 Firebase SDK,可在此处找到:firebase.google.com/docs。使用旧版 SDK(就像您现在所做的那样)只会导致比需要的更难。

    您可以通过以下方式获取用户信息:

    FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
    if (user != null) {
        for (UserInfo profile : user.getProviderData()) {
            // Id of the provider (ex: google.com)
            String providerId = profile.getProviderId();
    
            // UID specific to the provider
            String uid = profile.getUid();
    
            // Name, email address, and profile photo Url
            String name = profile.getDisplayName();
            String email = profile.getEmail();
            Uri photoUrl = profile.getPhotoUrl();
        };
    }
    

    【讨论】:

      猜你喜欢
      • 2018-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多