为什么我看不到这个用户的用户名?
为什么我看不到这个用户的用户名?
我正在使用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); Mapmap = new HashMap (); 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); } }); } });
结果是上面代码的结果:
[结果图片](https://i.stack.imgur.com/yt9Fo.png)
谢谢。
问题出现的原因是没有创建一个单独的数据库来存储用户的用户名。因为uid存储了特定客户端的所有信息,所以可能需要一个单独的数据库来存储用户名。
解决方法如下:
1. 创建一个单独的数据库来存储用户的用户名。
2. 参考以下链接了解如何使用电子邮件进行身份验证:关于使用电子邮件进行身份验证
3. 参考以下链接了解关于Auth()变量的相关信息:关于Auth()变量
4. 参考以下链接了解如何在Firebase中根据用户ID获取用户电子邮件的类似问题:在Firebase中根据用户ID获取用户电子邮件的类似问题
希望对你有帮助。
问题出现的原因是在使用email+password身份验证时,Firebase只需要电子邮件地址和相应的密码来验证用户,没有额外的字段用于查找底层提供者。因此,在注册过程中没有返回AuthData
对象,所以无法使用AuthData
对象的方法。
解决方法是,在注册表单中添加一个displayName
字段,并在数据库中存储该字段。在注册过程中,可以使用以下代码将displayName
存储到数据库中:
Firebase ref = new Firebase("https://<YOUR-FIREBASE-APP>.firebaseio.com"); ref.createUser(email.getText().toString(), password.getText().toString(), new Firebase.ValueResultHandler<Map<String, Object>>() { 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); } public void onError(FirebaseError firebaseError) { // there was an error } });
然后,在登录流程中,使用updateChildren()
方法来确保不覆盖displayName
字段:
button.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { ref.authWithPassword(email.getText().toString(), password.getText().toString(), new Firebase.AuthResultHandler() { 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); }
通过以上方法,可以解决无法看到用户名的问题。