在Android应用中使用Firebase(BaaS)存储电子邮件和密码时,如何包含用户名?

32
Firebase的createUser()方法需要email和password字段,但如果我还想让用户像Snapchat、Instagram、StackOverflow等应用一样拥有自定义用户名怎么办?是否有办法修改现有方法以接受该字段,还是我需要手动推送和管理这些信息?
这是我存储所需用户信息的第一次尝试:
Firebase ref = new Firebase(firebaseURL);
ref.createUser(email, password, new Firebase.ValueResultHandler<Map<String, Object>>() {
@Override
public void onSuccess(Map<String, Object> result) {
System.out.println("Successfully created user account with uid: " + result.get("uid"));

//Sign user in
Firebase ref = new Firebase(firebaseURL);
ref.authWithPassword(email, password, new Firebase.AuthResultHandler() {

@Override
public void onAuthenticated(AuthData authData) {
System.out.println("User ID: " + authData.getUid() + ", Provider: " + authData.getProvider());

//Save user info
Firebase userRef = new Firebase(firebaseURL + "Users/");
User user = new User(username, authData.getUid());
userRef.setValue(user);

这样做好吗?我想将UID与用户名一起存储,以便在将来处理更改时有所帮助。此外,如果这是一个社交媒体应用程序,我应该实现updateChildren()push()方法以避免覆盖条目吗?

这是我的第二次尝试:

  @Override
  public void onAuthenticated(AuthData authData) {
  System.out.println("User ID: " + authData.getUid() + ", Provider: " + authData.getProvider());

  //Save user info and username
  Firebase ref = new Firebase(firebaseURL);
  Map<String, String> map = new HashMap<String, String>();
  map.put("email", email);
  map.put("username", username);
  map.put("provider", authData.getProvider());

  ref.child("users").child(authData.getUid()).setValue(map);
3个回答

20

是的,Firebase有一种方法可以更新用户信息。您只需要阅读Firebase文档中描述的方法并实现此处更新用户信息

使用此方法,您可以更新FirabaseUser对象的displayName属性。只需为displayName属性设置用户名并提交更改即可。

希望这能帮到您。


2
尽管其他答案有一定的有效性,但这才是真正回答问题的答案。 - Jostein
1
这应该是被接受的答案。在这种情况下,您不需要将用户名存储在数据库中。 - Ashish Yadav
这是答案。 - ReyAnthonyRenacia

19

展示一个包含三个字段的表单:

  1. 用户名
  2. 电子邮件地址
  3. 密码

将后两个字段发送到 Firebase 的 createUser() 方法中。然后,在完成回调函数中,将所有信息存储在您的 Firebase 数据库中。

var userName, emailAddress, password;

// TODO: read these values from a form where the user entered them

var ref = new Firebase("https://<YOUR-FIREBASE-APP>.firebaseio.com");
ref.createUser({
  email    : emailAddress,
  password : password
}, function(error, authData) {
  if (error) {
    console.log("Error creating user:", error);
  } else {
    // save the user's profile into the database so we can list users,
    // use them in Security and Firebase Rules, and show profiles
    ref.child("users").child(authData.uid).set({
      provider: authData.provider,
      name: userName
    });
  }
});

请参阅Firebase文档中有关存储用户数据的页面以获取更多信息。


3
抱歉回复晚了。这似乎是针对JavaScript的,而我需要为Android的Java。对于每种语言,设置似乎略有不同,我在翻译时遇到了一些麻烦。 - young_souvlaki
1
当然。请编辑您的问题,包括您最好的代码,并让我看一下。 - Frank van Puffelen
1
好的!我非常感谢你愿意帮忙!但是先问一个问题:users父级和authData.uid对象...你是否需要手动将它们写入数据库,还是在使用createUser时会自动生成?它们在我的Firebase仪表板中没有显示出来,而我已经验证了一些伪用户。这些对象是否因用户隐私目的而被隐藏或无法访问? - young_souvlaki
2
代码是用JavaScript写的,本来应该是Java! - user4909407
3
如果用户在账户创建后但设置用户名前断开连接,这会导致问题吗? - user2997154
显示剩余8条评论

0

以下是一种将注册详细信息存储在数据库中的方法:

Map<String, String> parameters = new HashMap<>();
FirebaseDatabase mFirebaseInstance;
parameters.put(Constant.TAG_USER, strUsrS.trim());
parameters.put(Constant.TAG_EMAIL, strEmailS.trim());
parameters.put(Constant.TAG_PASS, strPassS.trim());
//use this if needed(pushId)
String pushId = mFirebaseInstance.getReference(YOUR TABLE NAME).getRef().push().getKey();
parameters.put(Constant.TAG_KEY, pushId.trim());

mFirebaseInstance.getReference(YOUR TABLE NAME).getRef().child(strUsrS.trim()).setValue(parameters);

尝试这个实现并执行...谢谢

希望您知道如何在Firebase中更改(创建)具有所需字段的表。

{{link1:相关问题和解决方案的讨论}}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接