Firebase数据库Android - 检查昵称是否存在,如果没有创建另一个昵称,直到我们获得新的昵称

时间:2017-05-03 11:05:14

标签: android firebase firebase-realtime-database

我想为第一次登录我的应用的每个用户创建一个昵称。昵称是用户的名字,我从1到9 000 000添加一个数字。例如,凯文邦德可以得到昵称kevin123456。

我将所有昵称存储在我的firebase数据库的节点中。两个用户不应该有相同的昵称,所以我必须检查我的数据库中是否存在昵称。如果它已经存在,我想创建另一个昵称,直到我得到一个新的昵称。

我目前: - 向usernickname节点添加一个监听器 - 在onDataChange中我有一个for循环来创建一个昵称,然后我用dataSnapshot.hasChild(newNickname)检查它是否已经存在。如果昵称不存在我用昵称做我想要的并打破for循环,如果它存在我循环for循环尝试另一个昵称。这是我的代码:

    mFirebaseDatabase.getReference().child("usernickname").orderByKey().addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for (int i = 0; i < 9000000; i++) {
                final Random random = new Random();
                randomNumberId = random.nextInt(9000000);
                String newNicknameId = mFirstnameId + String.valueOf(randomNumberId);
                //if the nickname already exists we restart the for loop to get a new random number
                if (dataSnapshot.hasChild(newNicknameId)) {
                    i++;
                    //else if the nickname doesn't exists we create it and stop the loop
                } else if (!dataSnapshot.hasChild(newNicknameId)) {
                    //do what I want...
                    break;
                }
            }
        }
    });

我的问题是我目前必须下载所有昵称节点或至少所有以用户名字开头的昵称。对我来说这是一个问题,因为如果我有很多用户,可能会花费我很多GB下载费用:D

我想我可以使用datasnapshot.exists()来检查昵称是否存在而不必下载所有昵称,但我不知道如果它已经存在,如何创建另一个昵称。我不能在侦听器外部使用for循环,并在需要时将其分解为侦听器内部。

您是否看到为我的用户创建新昵称的最佳方式是什么?

谢谢,

亚历

3 个答案:

答案 0 :(得分:0)

您需要使用另一个aproch来检查用户是否存在。您需要更改此行:

dataSnapshot.hasChild(newNicknameId);

dataSnapshot.child("userName").getValue().equals(newNicknameId);

其中userName是您存储newNicknameId的字段的名称,假设您的密钥 - &gt;值对看起来像这样:userName: "newNicknameId"

希望它有所帮助。

答案 1 :(得分:0)

 final Query query = mFirebaseDatabase.getReference().orderByChild("usernickname").equalTo("yourNewNickName");
        query.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                if (dataSnapshot.exists()) {
                    //here means the value exist
                    //do whatever you want to do
                } else {
                    //here means the value not exist
                    //do whatever you want to do
                }
            }

            @Override
            public void onCancelled(FirebaseError firebaseError) {
            }
        });

使用这将解决您的问题。 :)

答案 2 :(得分:0)

唯一昵称的更好方法是在名称上附加时间戳:

username + new Date().getTime();

这将添加一个像1493808526335这样的唯一长度,并且您可以确定两个用户不太可能使用相同的名称在同一毫秒内注册。