2016-09-21 12 views
2

ユーザ名が存在するかどうかを確認しようとしています。 queryOrderedBychildと呼ぶと、スナップショットの値は常に利用可能ですが、queryOrderbyというデータだけでなく、私のデータベース全体が印刷されます。私がqueryEqualToValueを呼び出すと、常にnullが返されます。私はそれを理解するために多くの方法を試しました。ユーザ名が既に存在するかどうか確認してください:Swift、Firebase

これは私のコードです:

DataService.instance.UsersRef.queryOrdered(byChild:"Nickname").queryEqual(toValue: "kai1004pro").observe(.value, with: { (snapshot) in 

     if (snapshot.value is NSNull) { 
      print("not found") 
     } else { 
      print("found") 
      print(snapshot.value) 
     } 




    }) 

は、これは私のJSONの木である:

Optional({ 
g50X0FvEsSO4L457v7NzS3dAABl1 =  { 
    "User Profile" =   { 
     Birthday = "Sep 20, 1992"; 
     Gender = Female; 
     Nickname = kai1004pro; 
     UserUID = g50X0FvEsSO4L457v7NzS3dAABl1; 
     emailAddress = "[email protected]"; 
     isFollow = 0; 
     isFriend = 0; 
    }; 
}; 
}) 

これは、セキュリティルールです:

"rules": { 
".read": true, 
".write": "auth != null", 
"Users": { 
    ".read": true, 
    ".write": "auth != null", 
    ".indexOn": ["Nickname", "User Profile"] 
    } 
    } 
} 
+0

あなたUsersRefは何ですか?私の推測では、この場合、ユーザーID(g50X0FvEsSO4L457v7NzS3dAABl1)にリンクしており、ニックネームはその直接の子ではないため、正しい場所を検索していないため、ニックネームを見つけることはできません。私がこれを経験したとき、子ノードを通して検索するときに.valueに問題があることを覚えていましたが、代わりに.ChildAddedと.ChildChangedを使用しました。 – Dallas

答えて

2

含めるようにJSONツリーを変更別のノードactive_usernamesは、すべてのユーザwhのユーザ名を追加しますeneverユーザー名が既に存在する場合は、あなたを確認するには...あなたのユーザーはそのユーザー名を変更するたびに変更し、

myApp:{ 
    users:{ 
    uid1:{....}, 
    uid2:{....}, 
    uid3:{....}, 
    uid4:{....}, 
    } 
active_usernames :{ 
    uid1username : "true", 
    uid2username : "true", 
    uid3username : "true", 
    uid4username : "true" 
    } 
} 

を新しいユーザーを作成します -

//Checking username existence 
FIRDatabase.database().reference().child("active_usernames").child(self.enteredUsername.text!).observeSingleEvent(of: .value, with: {(usernameSnap) in 

     if usernameSnap.exists(){ 
     //This username already exists 

     }else{ 

     //Yippee!.. This can be my username 
     } 

    }) 

また(読めるようにセキュリティルールを変更しますONLY READABLE)すべてに、セキュリティルールを操作します。

{rules :{ 

    active_usernames : { 

     ".read" : "true", 
     ".write" : "auth != null" 

     } 
    } 
    } 

PS: -enteredUsernameユーザー名を入力するテキストフィールドです。

提案: -は、TextFieldのdidChangeEditingイベント内のチェックコードを維持(より良いユーザー体験のために!)

+0

申し訳ありませんが、私は一日中寝ていました。私は非常に疲れていました。私はFirebaseについて何か質問する必要があります。ここにすべての質問を投稿することはできません。私はあなたにメールを送ることができます。どうもありがとうございました !!! –

+1

@KhôiVNguyễnそれはstackoverflowの仕組みではありません。良い質問がある場合は、ここに持って来てください。ほとんどのユーザーがオンラインになっている時間に質問を書くのは、通常は午前11時から午後4時までです。うまくいけば、あなたは答えを得るでしょう。または、以前の回答であなたの質問に対する答えを見つけることができます。 – Honey

関連する問題