为什么我看不到这个用户的用户名?

时间:2016-01-01 11:38:49

标签: android firebase-authentication

我正在使用Firebase通过电子邮件和密码进行用户身份验证,我想从authData检索用户的用户名,但我只看到uid。我想检索用户名,以便我可以在另一个活动上显示它。

这是我的代码:

      button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            ref.authWithPassword(email.getText().toString(), password.getText().toString(), new Firebase.AuthResultHandler() {
                @Override
                public void onAuthenticated(AuthData authData) {
                    setContentView(R.layout.activity_user_display);
                    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());
                    }
                    else
                    {
                        Context c = getApplicationContext();
                        Toast t = Toast.makeText(c, "You thought you had it", Toast.LENGTH_SHORT);
                    }
                    ref.child("users").child(authData.getUid()).setValue(map);

                }

                @Override
                public void onAuthenticationError(FirebaseError firebaseError) {
                    Context c = getApplicationContext();
                    Toast error = Toast.makeText(c,"Sorry :)",Toast.LENGTH_SHORT);
                }
            });
        }
    });`

结果是上面代码的结果:

this is the result of the code from above

谢谢。

2 个答案:

答案 0 :(得分:2)

您可能应该创建一个单独的数据库来存储客户端的用户名。由于uid存储了该特定客户端的所有信息,因此您可能需要一个单独的数据库。

这可能会对您有所帮助:

About Authentication using email

About Auth() Variable

Similar Question for retrieving email in FireBase

希望它对你有所帮助。

答案 1 :(得分:1)

使用电子邮件和密码验证时,Firebase仅需要电子邮件地址和相应的密码来验证用户身份。与社交提供商(Google,Facebook,Twitter,Github)不同,Firebase在底层提供商中没有其他字段。请参阅properties that are available in authData for the email+password provider的文档。

您可以轻松地在注册表单中添加displayName字段,但您必须自己跟踪并使用不同的代码路径将其存储在数据库中。 E.g。

Firebase ref = new Firebase("https://<YOUR-FIREBASE-APP>.firebaseio.com");
ref.createUser(email.getText().toString(), password.getText().toString(), new Firebase.ValueResultHandler<Map<String, Object>>() {
    @Override
    public void onSuccess(Map<String, Object> result) {
        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());
        }
        else {
            // read the display name from the text field
            map.put("displayName", displayName.getText().toString);
        }
        ref.child("users").child(authData.getUid()).setValue(map);
    }
    @Override
    public void onError(FirebaseError firebaseError) {
        // there was an error
    }
});

然后在您的登录流程中,只需确保不使用updateChildren()

覆盖displayName
      button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            ref.authWithPassword(email.getText().toString(), password.getText().toString(), new Firebase.AuthResultHandler() {
                @Override
                public void onAuthenticated(AuthData authData) {
                    setContentView(R.layout.activity_user_display);
                    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()).updateChildren(map);

                }