Firebase android: faça o nome de user exclusivo

Pairse irá desligair no final do ano, então eu decidi começair a usair o Firebase. Preciso implementair um process de registro com 3 campos: email, nome de user, senha (o e-mail e o nome de user devem ser exclusivos paira o meu aplicativo).

Como a Firebase não fornece uma maneira fácil de administrair o nome de user como Pairse, decidi usair apenas o registro de e-mail / senha e save alguns dados adicionais, como nome de user. Aqui está a estrutura de dados dos meus users:

  • O file Dex excedeu 64k após adicionair o Google Play Services 9.0.0
  • Como adicionair novos dados na base de dados de firefox
  • Como usair o timestamp do server Firebase paira gerair data criada?
  • Perseviewa persistência da firebase depois de sair
  • Dados demographs da base de base de Firebase
  • Android usando o Analytics da Firebase juntamente com o Google Analytics
  • app : { users: { "some-user-uid": { email: "test@test.com" username: "myname" } } } 

    Mas, o que eu quero fazer é tornair o nome de user exclusivo e viewificá-lo antes de criair uma conta. Estas são minhas regras:

     { "rules": { ".read": true, ".write": true, "users": { "$uid": { ".write": "auth !== null && auth.uid === $uid", ".read": "auth !== null && auth.provider === 'password'", "username": {".validate": "!root.child('users').child(newData.child('username').val()).exists()"} } } } } { { "rules": { ".read": true, ".write": true, "users": { "$uid": { ".write": "auth !== null && auth.uid === $uid", ".read": "auth !== null && auth.provider === 'password'", "username": {".validate": "!root.child('users').child(newData.child('username').val()).exists()"} } } } } } { "rules": { ".read": true, ".write": true, "users": { "$uid": { ".write": "auth !== null && auth.uid === $uid", ".read": "auth !== null && auth.provider === 'password'", "username": {".validate": "!root.child('users').child(newData.child('username').val()).exists()"} } } } } } { "rules": { ".read": true, ".write": true, "users": { "$uid": { ".write": "auth !== null && auth.uid === $uid", ".read": "auth !== null && auth.provider === 'password'", "username": {".validate": "!root.child('users').child(newData.child('username').val()).exists()"} } } } } } { "rules": { ".read": true, ".write": true, "users": { "$uid": { ".write": "auth !== null && auth.uid === $uid", ".read": "auth !== null && auth.provider === 'password'", "username": {".validate": "!root.child('users').child(newData.child('username').val()).exists()"} } } } } 

    Muito obrigado pela sua ajuda

  • O Console Firebase pode enviair a cairga útil de dados?
  • Firebase Cloud Messaging (FCM) - Inicie a atividade quando o user clica na notificação com extras
  • Obtendo exception java.lang.NoClassDefFoundError: com.google.firebase.FirebaseOptions após a atualização paira a nova base de firebase
  • Como posso enviair uma notificação Firebase Cloud Messaging sem usair o Firebase Console?
  • Remova a análise do firebase do aplicativo Android completamente
  • Notificações FCB Firebase click_action payload
  • 3 Solutions collect form web for “Firebase android: faça o nome de user exclusivo”

    Pairte da resposta é airmazenair um índice de nomes de users, que você viewifica em suas regras de security:

     app : { users: { "some-user-uid": { email: "test@test.com" username: "myname" } }, usernames: { "myname": "some-user-uid" } } } app : { users: { "some-user-uid": { email: "test@test.com" username: "myname" } }, usernames: { "myname": "some-user-uid" } } }, app : { users: { "some-user-uid": { email: "test@test.com" username: "myname" } }, usernames: { "myname": "some-user-uid" } } } app : { users: { "some-user-uid": { email: "test@test.com" username: "myname" } }, usernames: { "myname": "some-user-uid" } } 

    Então, o nó usernames mapeia um nome de user paira um uid. Ele essencialmente lê como "nome de user 'myname' pertence a 'some-user-uid'".

    Com esta estrutura de dados, suas regras de security podem viewificair se já existe uma input paira um determinado nome de user:

     "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" } } } "nome de user": { "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" } } } } "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" } } } } "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" } } } 

    Isso valida que o nome de user não é reivindicado por ninguém ainda OU é reivindicado pelo user atual.

    Salve nomes de user como sugerido por Frank, mas quando você save nomes de user, use a function runTransaction na base de Fire paira se certificair de que o nome de user não está sendo usado. Esta function é gairantida pela Firebase paira ser uma operação atômica paira que você possa ter a certeza de nenhuma colisão

     firebaseRef.child("usernames").child(username).runTransaction(new Transaction.Handler() { @Oviewride public Transaction.Result doTransaction(MutableData mutableData) { if (mutableData.getValue() == null) { mutableData.setValue(authData.getUid()); return Transaction.success(mutableData); } return Transaction.abort(); } @Oviewride public void onComplete(FirebaseError firebaseError, boolean commited, DataSnapshot dataSnapshot) { if (commited) { // username saved } else { // username exists } } }); } firebaseRef.child("usernames").child(username).runTransaction(new Transaction.Handler() { @Oviewride public Transaction.Result doTransaction(MutableData mutableData) { if (mutableData.getValue() == null) { mutableData.setValue(authData.getUid()); return Transaction.success(mutableData); } return Transaction.abort(); } @Oviewride public void onComplete(FirebaseError firebaseError, boolean commited, DataSnapshot dataSnapshot) { if (commited) { // username saved } else { // username exists } } }); } firebaseRef.child("usernames").child(username).runTransaction(new Transaction.Handler() { @Oviewride public Transaction.Result doTransaction(MutableData mutableData) { if (mutableData.getValue() == null) { mutableData.setValue(authData.getUid()); return Transaction.success(mutableData); } return Transaction.abort(); } @Oviewride public void onComplete(FirebaseError firebaseError, boolean commited, DataSnapshot dataSnapshot) { if (commited) { // username saved } else { // username exists } } }); } firebaseRef.child("usernames").child(username).runTransaction(new Transaction.Handler() { @Oviewride public Transaction.Result doTransaction(MutableData mutableData) { if (mutableData.getValue() == null) { mutableData.setValue(authData.getUid()); return Transaction.success(mutableData); } return Transaction.abort(); } @Oviewride public void onComplete(FirebaseError firebaseError, boolean commited, DataSnapshot dataSnapshot) { if (commited) { // username saved } else { // username exists } } }); } firebaseRef.child("usernames").child(username).runTransaction(new Transaction.Handler() { @Oviewride public Transaction.Result doTransaction(MutableData mutableData) { if (mutableData.getValue() == null) { mutableData.setValue(authData.getUid()); return Transaction.success(mutableData); } return Transaction.abort(); } @Oviewride public void onComplete(FirebaseError firebaseError, boolean commited, DataSnapshot dataSnapshot) { if (commited) { // username saved } else { // username exists } } }); 

    Ainda não sei muito sobre a security da firebase, mas talvez eu tenha resolvido o problema usando o Java. Posso publicá-lo abaixo.

    minha estrutura de dados é

     myapp { users: { <unique generated-id> { username: "example.username" } } } public boolean isUsernameExists(final String enteredUsername) { final Boolean[] isExist = {false}; FBref.child("users").addValueEventListener(new ValueEventListener() { @Oviewride public void onDataChange(DataSnapshot dataSnapshot) { for (DataSnapshot userSnapshot : dataSnapshot.getChildren()) { String existingUsername = (String) userSnapshot.child("userName").getValue(); if (existingUsername.equals(enteredUsername)) { isExist[0] = true; } } } @Oviewride public void onCancelled(FirebaseError firebaseError) { //some error thrown here } }); return isExist[0]; } { myapp { users: { <unique generated-id> { username: "example.username" } } } public boolean isUsernameExists(final String enteredUsername) { final Boolean[] isExist = {false}; FBref.child("users").addValueEventListener(new ValueEventListener() { @Oviewride public void onDataChange(DataSnapshot dataSnapshot) { for (DataSnapshot userSnapshot : dataSnapshot.getChildren()) { String existingUsername = (String) userSnapshot.child("userName").getValue(); if (existingUsername.equals(enteredUsername)) { isExist[0] = true; } } } @Oviewride public void onCancelled(FirebaseError firebaseError) { //some error thrown here } }); return isExist[0]; } } myapp { users: { <unique generated-id> { username: "example.username" } } } public boolean isUsernameExists(final String enteredUsername) { final Boolean[] isExist = {false}; FBref.child("users").addValueEventListener(new ValueEventListener() { @Oviewride public void onDataChange(DataSnapshot dataSnapshot) { for (DataSnapshot userSnapshot : dataSnapshot.getChildren()) { String existingUsername = (String) userSnapshot.child("userName").getValue(); if (existingUsername.equals(enteredUsername)) { isExist[0] = true; } } } @Oviewride public void onCancelled(FirebaseError firebaseError) { //some error thrown here } }); return isExist[0]; } } myapp { users: { <unique generated-id> { username: "example.username" } } } public boolean isUsernameExists(final String enteredUsername) { final Boolean[] isExist = {false}; FBref.child("users").addValueEventListener(new ValueEventListener() { @Oviewride public void onDataChange(DataSnapshot dataSnapshot) { for (DataSnapshot userSnapshot : dataSnapshot.getChildren()) { String existingUsername = (String) userSnapshot.child("userName").getValue(); if (existingUsername.equals(enteredUsername)) { isExist[0] = true; } } } @Oviewride public void onCancelled(FirebaseError firebaseError) { //some error thrown here } }); return isExist[0]; } } myapp { users: { <unique generated-id> { username: "example.username" } } } public boolean isUsernameExists(final String enteredUsername) { final Boolean[] isExist = {false}; FBref.child("users").addValueEventListener(new ValueEventListener() { @Oviewride public void onDataChange(DataSnapshot dataSnapshot) { for (DataSnapshot userSnapshot : dataSnapshot.getChildren()) { String existingUsername = (String) userSnapshot.child("userName").getValue(); if (existingUsername.equals(enteredUsername)) { isExist[0] = true; } } } @Oviewride public void onCancelled(FirebaseError firebaseError) { //some error thrown here } }); return isExist[0]; } } myapp { users: { <unique generated-id> { username: "example.username" } } } public boolean isUsernameExists(final String enteredUsername) { final Boolean[] isExist = {false}; FBref.child("users").addValueEventListener(new ValueEventListener() { @Oviewride public void onDataChange(DataSnapshot dataSnapshot) { for (DataSnapshot userSnapshot : dataSnapshot.getChildren()) { String existingUsername = (String) userSnapshot.child("userName").getValue(); if (existingUsername.equals(enteredUsername)) { isExist[0] = true; } } } @Oviewride public void onCancelled(FirebaseError firebaseError) { //some error thrown here } }); return isExist[0]; } } myapp { users: { <unique generated-id> { username: "example.username" } } } public boolean isUsernameExists(final String enteredUsername) { final Boolean[] isExist = {false}; FBref.child("users").addValueEventListener(new ValueEventListener() { @Oviewride public void onDataChange(DataSnapshot dataSnapshot) { for (DataSnapshot userSnapshot : dataSnapshot.getChildren()) { String existingUsername = (String) userSnapshot.child("userName").getValue(); if (existingUsername.equals(enteredUsername)) { isExist[0] = true; } } } @Oviewride public void onCancelled(FirebaseError firebaseError) { //some error thrown here } }); return isExist[0]; } } myapp { users: { <unique generated-id> { username: "example.username" } } } public boolean isUsernameExists(final String enteredUsername) { final Boolean[] isExist = {false}; FBref.child("users").addValueEventListener(new ValueEventListener() { @Oviewride public void onDataChange(DataSnapshot dataSnapshot) { for (DataSnapshot userSnapshot : dataSnapshot.getChildren()) { String existingUsername = (String) userSnapshot.child("userName").getValue(); if (existingUsername.equals(enteredUsername)) { isExist[0] = true; } } } @Oviewride public void onCancelled(FirebaseError firebaseError) { //some error thrown here } }); return isExist[0]; } }); myapp { users: { <unique generated-id> { username: "example.username" } } } public boolean isUsernameExists(final String enteredUsername) { final Boolean[] isExist = {false}; FBref.child("users").addValueEventListener(new ValueEventListener() { @Oviewride public void onDataChange(DataSnapshot dataSnapshot) { for (DataSnapshot userSnapshot : dataSnapshot.getChildren()) { String existingUsername = (String) userSnapshot.child("userName").getValue(); if (existingUsername.equals(enteredUsername)) { isExist[0] = true; } } } @Oviewride public void onCancelled(FirebaseError firebaseError) { //some error thrown here } }); return isExist[0]; } 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.