2016-09-20 43 views
2

如何確保用戶名(由用戶通過EditText字段選擇)是唯一的?我目前使用的實時數據庫:Firebase:檢查用戶名是否已存在

FirebaseAuth auth = FirebaseAuth.getInstance(); 
FirebaseUser user = auth.getCurrentUser(); 
mDatabase = FirebaseDatabase.getInstance(); 
User mUser = new User(user.getUid().toString(), username); 
DatabaseReference allUsersRef = mDatabase.getReference("AllUsers"); 
allUsersRef.child(user.getUid().toString()).setValue(mUser); 

username =用戶名由用戶選擇的; User =對象,其只包含UID和用戶名)

這將產生以下結構:

MyApp 
| 
---AllUsers 
    | 
    ---THE_USERS_UID 
      | 
      |---username: "THE_USERS_USERNAME" 
      | 
      |---uid: "THE_USERS_UID" 

因此,如果有人打開我的應用程序,並且必須選擇一個用戶名,我該如何「阻止」他選擇其他人已經選擇的用戶名?

乾杯!

+0

你可以使用dataSnapshot.exists()或dataSnapshot.hasChild()M編制方法。 – uguboz

+0

卡拉姆的回答有重要的部分,這就是你需要用規則來保證這一點。另請參閱[這個經典答案](http://stackoverflow.com/questions/25294478/how-do-you-prevent-duplicate-user-properties-in-firebase)和可能很多[這些](http:///stackoverflow.com/search?q=%5Bfirebase%5D+unique+username) –

回答

5

您可以在/usernames位置創建另一個分支,該分支包含帶有已獲取用戶名的密鑰的子級,以及聲明該用戶的$uid父級的子級。

{ 
    "users": { 
     "$uid": { 
      "username": { 
       "callam": true 
      } 
     } 
    }, 
    "usernames": { 
     "callam": { 
      "$uid": true 
     } 
    } 
} 

現在,您可以創建在users/$uid/username/$username一個驗證規則,只允許如果$username一直深受用戶的$uid/usernames/$username/$uid聲稱寫。

"users": { 
    "$uid": { 
     "username": { 
      ..., 
      "$username": { 
       ".validate": "root.child('usernames/' + $username).hasChild($uid)" 
      } 
     } 
    } 
} 

你可以再拍規則,只允許你在要求一個/usernames/$username用戶名如果​​沒有已經處於該位置的值。

"usernames": { 
    ..., 
    "$username": { 
     "$uid": { 
      ".validate": "auth.uid == $uid && !data.exists()" 
     } 
    } 
} 

或者

數據庫

{ 
    "usernames": { 
     "callam": "$uid" 
    }, 
    "users": { 
     "$uid": { 
      "username": "callam" 
     } 
    } 
} 

規則

{ 
    "usernames": { 
     "$username": { 
      ".validate": "auth.uid == newData.val() && !data.exists()" 
     } 
    }, 
    "users": { 
     "$uid": { 
      "username": { 
       ".validate": "auth.uid == $uid && root.child('usernames/'+newData.val()).val() == $uid" 
      } 
     } 
    } 
} 
+4

「'.validate」:「auth.uid == newData.val()&&!data.exists()」'在上一條規則真的是解決這個問題的關鍵。它可以防止任何人覆蓋現有的「聲明」用戶名,但允許所有者仍然刪除它。 –

+0

http://stackoverflow.com/questions/43752247/how-to-check-already-existed-email-in-firebase-database – chris

相關問題