Swift 检查Firebase中是否存在用户名

Swift 检查Firebase中是否存在用户名,swift,firebase,firebase-realtime-database,Swift,Firebase,Firebase Realtime Database,我有一个这样的数据库 users/UID1/“Username”(属于用户1) 等等 我想检查用户名是否存在,但我无法使用所有现有UID进行循环。 目前,我已尝试: let databaseRef = Database.database().reference() databaseRef.child("users").child("uid").child("Username").observeSingleEvent(of: DataEventType.va

我有一个这样的数据库

users/UID1/“Username”(属于用户1)

等等

我想检查用户名是否存在,但我无法使用所有现有UID进行循环。 目前,我已尝试:

let 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")
                }
            })

        }
我不知道应该放什么来代替child(“uid”)循环到数据库中的每个uid中并检查用户名是否存在


谢谢你的帮助

Android中的

DataSnapshot实例包含来自Firebase数据库位置的数据。每次读取数据库数据时,都会将数据作为DataSnapshot接收。

检查记录是否存在的方法。基于此文档

如:

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中:

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());
                        }
                    });
您可以通过以下方式进行检查:

对于目标C: 存在

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

您可以从本文档中阅读更多内容

对于Swift:

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());
                        }
                    });
存在()

func exists()->Bool


实现这一点的最简单方法是在注册用户时,使用用户的唯一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)
编辑:

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());
                        }
                    });
多亏了@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)

您好,没有办法在每个UID中循环?请忘记我之前的评论,我的咖啡还没有开始。这是可能的,但更改数据结构会更容易。你可以查看我链接的问题。特别检查我自己的答案,因为接受的答案加载的数据比需要的多:您好,这是android的?我不明白你的意思answer@Bonilla你可以检查我给的链接。Firebase具有相同的DataSnapshot类,用于检查记录是否存在。@PeterHaddad对此表示抱歉。但是你现在可以检查了,我已经更新了我的答案。@Bonilla你现在可以检查了。我已经更新了我的答案。除了使用1作为值,你还可以使用uid将用户名链接到用户。@AndréKool说得很好。非常有用谢谢!这是一个很好的观点。如果需要检查用户名是否存在,请不要加载所有用户名。这是对带宽的浪费。而是
reference.child(“usernames”).child(username).observeSingleEvent(of:.值,在if snapshot.exists()中使用:{(snapshot)){
正如我在这里所展示的:谢谢Daniel。也谢谢你帮助一位开发人员了解查找映射。对于刚接触Firebase/NoSQL的开发人员来说,这些总是让人困惑,因为这些东西都内置在大多数关系数据库中。