2017-05-24 26 views
1

私はJAVA/Firebaseのスキルを実践するために小さなアプリを開発しています。私は、Firebaseとデータベース部分に関連するルールにあまり慣れていないことを認めます。しかし、私は他のSOの投稿を見て、ドキュメントを検索しようとしました。Firebase Database + Javaで重複するユーザ名を避ける

問題: ユーザはアカウントを作成します(Firebase認証 - 電子メール/パスワードを使用)。それから、彼らは「文字」を作り、この「文字」に名前を付けることができます。ですから、私は "charName"が一意である必要があります。そして、明らかに、認証されたIDも既にユニークです。だから私は、名前が既に取られているかどうかをユーザーに伝えるためにアプリが必要です。そうでない場合は、データベースに追加してください。現在

btnCreate.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       final String charName = "MyCharactersName"; 
       final int charID = 123; 

       mFirebaseDatabase.child("characters").addListenerForSingleValueEvent(new ValueEventListener() { 
        @Override 
        public void onDataChange(DataSnapshot snapshot) { 
         if (!(snapshot.child(charName).exists())) { 

           Character newCharacter = new Character(charID, charName); 

           mFirebaseDatabase.child("characters").child(getNewCharID()).setValue(newCharacter); // add to database 

           Snackbar.make(findViewById(R.id.view_root), "Success", BaseTransientBottomBar.LENGTH_INDEFINITE).show(); 
          } else { 
           Snackbar.make(findViewById(R.id.view_root), "Error creating a character.", BaseTransientBottomBar.LENGTH_INDEFINITE).show(); 
          } 
         } else { 
          Snackbar.make(findViewById(R.id.view_root), "That character name is already taken.", BaseTransientBottomBar.LENGTH_INDEFINITE).show(); 
         } 
        } 
@Override 
    public void onCancelled(DatabaseError databaseError) { 
          Snackbar.make(findViewById(R.id.view_root), "Error - Did not connect with Database", BaseTransientBottomBar.LENGTH_INDEFINITE).show(); 
        } 
       }); 
      } 
     }); 

:ここ

は、私のコードの簡略化snippitsているアプリは、データベースに新しいキャラクターを作成していますが、重複した文字を追加することができます。 (charIDは途中で一意ですが、上記のスニペットでハードコードしましたが、timeStamp + 4のランダムな数字です)。

明らかに、デフォルトのデータベースルールで発生します。そして私が読んだ例では、それらを修正しなければならないように見えますか?

私のデータベース構造のようなある:

App/characters/charID/charName 

私はこのSO記事からいくつかのコードに適応しようとした:How do you prevent duplicate user properties in Firebase?

をし、これは私が書いたものですが、それは仕事と私としません。私は規則に精通していないので、私は何をしたのか間違っているのか分かりません。ハハ。

{ 
    "rules" : { 
    "characters" : { 
     "$charID" : { 
     ".validate": "root.child('charName_lookup/'+newData.val()).val() === auth.uid" 
     } 
    }, 
    "charName_lookup" : { 
     "$charName" : { 
     ".write" : "!data.exists()", 
     ".validate": "newData.val() === auth.uid" 
     } 
     } 
    } 
} 

ご不明な点がありましたら、お知らせください。私は定期的にコンピュータから離れることになりますが、私はすぐに確認します(私は願っています)。

答えて

0

基本的に、userNameまたはemail addressはあなたのノードの名前でなければなりません。ルールに関しては、ワイルドカードを使用できます。 userName Georgeを作成する場合、存在するかどうかを確認するには、ユーザーのノードに参照を入れるだけで、exists()メソッドを使用する必要があります。

Frank van Puffelenの説明をvideoからご覧ください。データベースを少し改造する必要がある場合でも、重複について話しているときは、これがベストプラクティスであることに注意してください。

+0

大丈夫です。私はクリップを見ました。だから基本的に、私は "charName"の私の価値を取って、レベルの上に移動する必要があります!だから... App/characters/charName/charID +その他の情報。すべて "charName"の下に格納されています 私のフォローアップの質問はルールに関するものです。既存のエントリを書き換えないようにするにはどうすればよいですか?なぜなら、私が最初に問題となったのは、これまでずっとテストをしていたときだったと思うからです。ですから、もし私がcharName = "George"を持っていて、同じ名前のアカウントをもう一度クリックしたら、既存の "George"を上書きしませんか? –

+0

デフォルトルールでテストしました。そして、それは働いているようです。それは私に2番目の "ジョージ"を作ってもらうことはできませんでした。ありがとうアレックス! –

+0

最新の回答をご覧ください。 –

関連する問題