I am making an Android application using Firebase
realtime database. When a new user registers on my app, that user\'s data is saved in the Firebase database. <
To check a existence of user, please use the below code:
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference userNameRef = rootRef.child("Users").child("Nick123");
ValueEventListener eventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if(!dataSnapshot.exists()) {
//create new user
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
Log.d(TAG, databaseError.getMessage()); //Don't ignore errors!
}
};
userNameRef.addListenerForSingleValueEvent(eventListener);
You can also use a Query to achieve the same thing like this:
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
Query query = rootRef.child("Users").orderByChild("userName").equalTo("Nick123");
query.addValueEventListener(/* ... */);
This is another approach which is looping through the entire Users
node but is not just using a direct reference to a single user. This option is more likely to be used when you are using as a unique identifier beteeen users the uid
instead of the user name (as you do right now). So if your database structure might looks similar to this:
Firebase-root
|
--- Users
|
--- uid
|
--- userName: "Test User"
|
--- emailAddress: "user@email.com"
The second solution is the recommended one.
There is also another solution which involves you to create another node named userNames
, in which you can hold only the unique user names. Please also find below the corresponding security rules:
"Users": {
"$uid": {
".write": "auth !== null && auth.uid === $uid",
".read": "auth !== null && auth.provider === 'password'",
"userName": {
".validate": "
!root.child('userNames').child(newData.val()).exists() ||
root.child('userNames').child(newData.val()).val() == $uid"
}
}
}
But since in this case, your user name is already the name of the node, I recommend you go ahead with the first one.