firebase重复用户名和自定义登录

时间:2016-07-18 17:01:19

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

我当前的firebase系统允许我使用firebase createuser()接收电子邮件和密码注册新用户。在oncomplete方法中,我还会使用用于注册的详细信息,以便电子邮件和密码以及其他一些变量我创建诸如用户名和DOB,并使用以下代码将它们保存到firebase数据库:

// ...database code above
DatabaseReference users = database.getReference("users"); 
User user = new User(username, password,DOB,email); 
users.push().setValue(user);
  1. 我需要在保存到数据库之前检查用户名是否唯一,如果它不是要求另一个用户名
  2. 我还实现了一个系统,当用户登录时,它检查字符串是否是电子邮件或用户名,如果用户使用电子邮件登录,那么它将使用firebase的系统登录但如果他们使用一个用户名然后它必须检查firebase数据库以查看用户名是否存在,然后检查密码是否正确
  3. 我不知道如何做以上任何一项,非常感谢任何帮助。我已经使用了stackoverflow搜索,并意识到有问题的帖子已经被问过,我已经尝试了一些这些无效的解决方案,因为每个人的数据库结构都不同

1 个答案:

答案 0 :(得分:2)

让我关注目前的第一个问题。 唯一用户名。

在Firebase中进行更多检索的一个关键方面是构建数据。结构如何决定应用程序的功能效率。

对于唯一的用户名,我在您的Firebase数据库中建议了类似的内容。

enter image description here

在上面的数据库结构中,我为可用的用户名创建了一个单独的节点(因为 某些 值是必需的)。因此,每次我必须检查时,我都不必查看 USERS 节点的其他详细信息。

在您的应用程序中,您可以通过这种方式使用它来存储用户名。

FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference takenNames = database.getReference("TakenUserNames");

.
.
.
//On Successful Registeration
.
takenNames.child(username).setValue(true);

在注册时,您可以像这样检索该值:

public boolean doesNameExist(final String sUsername)
    {
theTakenNameRef = database.getReference("TakenUserName");
        theTakenNameRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                if(dataSnapshot.hasChild(sUsername))
                {
                    isTaken = true;
                }
                else if (!dataSnapshot.hasChild(sUsername))
                {
                    isTaken = false;
                }

            }

            @Override
            public void onCancelled(DatabaseError databaseError) {
                Toast.makeText(mContext, "Connection Error. Please try again in some time.", Toast.LENGTH_SHORT).show();
            }
        });

        return isTaken;
    }
.
.
.
.
.
.
//Calling it in method
String username = editText.getText().toString().trim().toUpperCase();
boolean exists = doesNameExist(username);
if(exists)
{
//Show Error
}
else
{
//Continue Registration
}
}

希望这可以清楚地检查唯一用户名的效率。

使用这种机制,你也可以把你的逻辑放在第二个问题上。