Swift 检查Firebase中是否存在用户名
我有一个这样的数据库 users/UID1/“Username”(属于用户1) 等等 我想检查用户名是否存在,但我无法使用所有现有UID进行循环。 目前,我已尝试: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
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的开发人员来说,这些总是让人困惑,因为这些东西都内置在大多数关系数据库中。