检查Firebase中是否存在用户名

时间:2018-06-18 09:19:23

标签: swift firebase firebase-realtime-database

我有一个像这样的数据库

用户/ UID1 /"用户名" (用户1)

 /UID2/"Username" (of user 2)
 /UID3/"Username" (of user 3)
 /UID4/"Username" (of user 4)

依旧......

我想检查用户名是否存在,但我没有设法进入包含所有现有UID的循环。 现在我试过了:

让databaseRef = Database.database()。reference()

        databaseRef.child("users").child("uid").child("Username").observeSingleEvent(of: DataEventType.value, with: { (snapshot) in
            switch snapshot.value {
            case let value as Bool where value:
                // value was a Bool and equal to true
                print ("username found")
            default:
                // value was either null, false or could not be cast
                print ("username not found")
            }
        })

    }

我不知道该放什么而不是孩子(" uid")循环到我数据库中的每个uid并检查用户名是否存在

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

在Android中

DataSnapshot实例包含Firebase数据库位置的数据。每次读取数据库数据时,都会以DataSnapshot的形式接收数据。

DataSnapshot有exists()方法检查记录是否存在。基于此文档https://firebase.google.com/docs/reference/android/com/google/firebase/database/DataSnapshot.html#exists()

赞:

reciverDatabase.getRef().addListenerForSingleValueEvent(new ValueEventListener() {
                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot) {
                            if (dataSnapshot.exists()) {
                                reciverDatabase.child(Constants.CONVERSATION_UNREAD_COUNT).setValue(dataSnapshot.getValue(Long.class) + 1);
                            }
                        }

                        @Override
                        public void onCancelled(DatabaseError databaseError) {
                            Crashlytics.logException(databaseError.toException());
                            sendMessageListener.onSendMessageFailure(databaseError.getMessage());
                        }
                    });

在iOS中:

你可以检查它:

对于目标C:存在

Desc:如果DataSnapshot包含非空值,则返回YES。

您可以阅读本文档中的更多内容https://firebase.google.com/docs/reference/ios/firebasedatabase/api/reference/Classes/FIRDataSnapshot#/c:objc(cs)FIRDataSnapshot(im)exists

对于Swift:

<强>存在()

func exists() - &gt;布尔

https://firebase.google.com/docs/reference/swift/firebasedatabase/api/reference/Classes/DataSnapshot#/c:objc(cs)FIRDataSnapshot(im)exists

答案 1 :(得分:1)

实现这一目标的最简单方法是注册用户,使用其唯一的UID创建用户并将所有数据保存在那里,就像你正在做的那样但也创建一个名为“usernames”的节点,该节点只保存所有用户名,注册时使用密钥作为用户名,值为1,如下所示:

Usernames {
 - username: 1
}

当用户注册然后输入用户名时,您可以检查它是否存在:

let username = "username that user has typed in"

let reference = Database.database().reference()
reference.child("usernames").observeSingleEvent(of: .value, with: { (snapshot) in

    if snapshot.hasChild(username) {

        print("Already exists")

    } else {

        print("Doesn't exist")

    }

}, withCancel: nil)

修改

感谢@FrankvanPuffelen,这是一种更有效的方法 - 无需遍历每个用户名。

let reference = Database.database().reference()
reference.child("usernames").child(username).observeSingleEvent(of: .value, with: { (snapshot) in

    if snapshot.exists() {

        print("Username already exists")

    } else {

        print("Username doesn't already exist")

    }

}, withCancel: nil)