2017-03-15 11 views
3

私はSwiftとFirebaseが比較的新しく、特定の値を見つけるためにFirebaseデータベースに問い合わせる方法を探しています。私が開発しているアプリケーションのコンテキストでは、ユーザーがサインアップするときに、ユーザー名を選択しなければならず、他のユーザーがすでにそのユーザー名を持っていないことをデータベースで確認する必要があります。私のデータベース構造はようになります。Firebaseのクエリ(Swift)で、すべてのユーザの特定の値を見つける

Image of DB structure

はのは、私がアプリに登録していると私は私のユーザー名は「マイク」になりたいとしましょう。私はアプリは「マイク」はすでに使用されているが、私のFirebaseのコードは動作しないかどうかを確認するために、データベース内のすべての「ユーザ名」フィールドに検索したい:

let queryRef = FIRDatabase.database().reference().child("users") 
    queryRef.queryOrdered(byChild: "username") 
     .queryEqual(toValue: self.username.text) 
     .observeSingleEvent(of: .value, with: { snapshot in 
      if snapshot.exists() 
      { 
       print(snapshot) 
      } 
     }) 

すべて「のスナップショット」の後に」doesnの実行されなくても(命令セット上をジャンプする)。現時点では、実際のチェックを行う前に、私は「スナップショット」の値を試してみるようテストしていますが、決して印刷されません。

私はそれを照会しようとしている誰もがアクセスできるようにする「ユーザー名」キーを必要とするためように私のDBのルールを設定します。

{ 
    "rules": { 
    "users": { 
     "$uid": { 

     "email": { 
      ".read": "$uid === auth.uid", 
      ".write": "$uid === auth.uid", 
     }, 
     "username": { 
      ".read": true, 
      ".write": "$uid === auth.uid", 
     } 

     } 
    }  
    } 
} 

それは、「ユーザ名以外のプライベートのすべてを維持するために、ここで私のために重要です"キー。この例では、わかりやすくするために「電子メール」と「ユーザー名」キーしかありませんが、私の実際のアプリでは、より多くの方法(姓、名字、生年月日、電話番号など)を持っています。

Anyこの時点で助けをいただければ幸いです。 ありがとうございました

答えて

1

私はこれが可能ではないと思います。 Firebaseドキュメントから

ルールは、原子方法で適用されます。つまり、アクセスを許可するルールがその場所または親の場所にない場合、読み取りまたは書き込み操作はすぐに失敗します。影響を受けるすべての子パスにアクセス可能であっても、親ロケーションでの読み取りは完全に失敗します。あなたのケースでは

あなたはusernameでフィルタしようとしているが、あなたはそれがPERMISSION_DENIEDために失敗するようフィルタリングを完了することができませんusers親ノードのためにそこに支配していないよう。

users/a_valid_uid/usernameにアクセスできますが、パス全体がアクセス可能です。

これを回避する方法として、ユーザー名のみを含む別のノードを用意し、これを一般のユーザーが読むことができるようにすることがあります。

Firebaseルールhereに関する完全なドキュメントが表示されます。

注:Firebase Rulesシミュレータを使用して、ルールを展開する前にテストすることができます。

関連する問題