2016-05-07 10 views
0
{ 
    "Users" : { 
    "750bf295-1a99-4b0f-a072-cae87d25f53e" : { 
     "email" : "[email protected]", 
     "hotel" : {   
     "Island" : { 
      "author" : "Jole", 
      "comfort" : 5.0, 
      "food" : 2.0, 
      "latit" : 65.05243844618913, 
      "longit" : -19.647914953529835, 
      "name" : "Island", 
      "rating" : 3.0, 
      "review" : "OK nije los", 
      "service" : 2.0 
     },  
    }, 
     "password" : "aa", 
     "username" : "Jole" 
    }, 
    "8b76cd9e-6738-412d-9e55-986b1fe967f9" : { 
     "email" : "[email protected]", 
     "hotel" : {    
     "Bologna" : { 
      "author" : "oooo", 
      "comfort" : 3.0, 
      "food" : 3.5, 
      "latit" : 44.507442, 
      "longit" : 11.348376, 
      "name" : "Bologna", 
      "rating" : 3.3333332538604736, 
      "review" : "woooooooow", 
      "service" : 3.5 
     }, 
     "Lodz" : { 
      "author" : "oooo", 
      "comfort" : 5.0, 
      "food" : 1.5, 
      "latit" : 51.759325127252225, 
      "longit" : 19.455432258546352, 
      "name" : "Lodz", 
      "rating" : 3.3333332538604736, 
      "review" : "losa hrana", 
      "service" : 3.5 
      } 
      }, 
      "password" : "oooo", 
      "username" : "oooo" 
     } 

まず、これは私のJSONです。さて、問題は、私は新しいユーザーを登録しているときに、ユーザー名と電子メールの両方が以前に使用されていない(またはすでに存在する)場合にのみ登録を許可したいと思います。forループは、dataSnapshotの子をループするときに中断しないようです。

私はそれがMVPパターンを使用して、私はボタンを登録する]をクリックしたときにそう、それは適切な長さ/タイプのユーザ名/ EMAI /パスワードフィールドをチェックし、すべてのOKならば、それは発表者は、registerNewUserメソッドを呼び出しました:

@Override 
    public void registerNewUser(String username, String email, String password) { 
     interactor.checkIfUserExists(username, email, password); 
    } 

その後、相互作用因子のchekIfUserExistsメソッドを呼び出します:

@Override 
    public void checkIfUserExists(final String username, final String email, final String password) { 
     Firebase userRef = new Firebase("https://josip-my-application.firebaseio.com/Users/"); 
     userRef.addListenerForSingleValueEvent(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       for (DataSnapshot snapshot : dataSnapshot.getChildren()) { 
        User user = snapshot.getValue(User.class); 
        if (email.equals(user.getEmail()) || username.equals(user.getUsername())) { 
         presenter.onUserAlreadyExists(); 
         break; 
        } else { 
         presenter.onUserDoesNotExist(username, email, password); 

        } 
       } 
      } 

プレゼンターのメソッドonUserAlreadyExistsが呼び出されたときに、それだけで「このユーザー名または電子メールが既に使用されている」というエラーメッセージを設定し...とプレゼンターのメソッドonUserDoesNotExistが呼び出されたときには、相互作用を呼び出しますORS方法tryToRegister():

for (DataSnapshot snapshot : dataSnapshot.getChildren()) { 
        User user = snapshot.getValue(User.class); 
        if (email.equals(user.getEmail()) || username.equals(user.getUsername())) { 
         presenter.onUserAlreadyExists(); 
         break; 
        } else { 
         presenter.onUserDoesNotExist(username, email, password); 
        } 

私は、既存の電子メールや別のユーザー名を登録しようとした場合、それはループ破壊し、プレゼンターのonUserAlreadyExistsを呼び出します:さて、問題はループのためにこれである

@Override 
    public void tryToRegister(final String username, final String email, final String password) { 
     userRef.createUser(email, password, new Firebase.ValueResultHandler<Map<String, Object>>() { 
      @Override 
      public void onSuccess(Map<String, Object> stringObjectMap) { 
       String uid = stringObjectMap.get("uid").toString(); 
       userRef = new Firebase("https://josip-my-application.firebaseio.com/Users/" + uid); 
       userRef.setValue(createUser(username, email, password)); 
       presenter.onSuccess(email, username); 
      } 

      @Override 
      public void onError(FirebaseError firebaseError) { 
       presenter.onFailure(); 
      } 
     }); 
    } 

既存のユーザー名と既存のメール以外のメールに登録しようとするとループが壊れ、ユーザー名や電子メールがすでに使用されていることがわかります既存のユーザー名と既存のメールがない新しいユーザーを作成します...ここに何か不足していますか?

答えて

0

これは、if/elseステートメントが各ユーザー名に対してチェックしてトリガーするためです。

つまり、データベースにFIRSTユーザーのユーザー名または電子メールがない場合、新しいユーザーが作成された後、データベース内の次のユーザーに移動し、確認、繰り返しコピーが見つかるまで続行し、「このユーザー名または電子メールはすでに使用されています」と表示されてから停止します。

したがって、この問題を解決するには、スナップショット内の各ユーザーの処理が完了して一致するものがないことを確認するまで、presenter.onUserDoesNotExist(username, email, password);に電話をかけてはいけません。

ところで、あなたの問題の素晴らしい文書と説明。

+0

ありがとうジュリアン! :)それは私が思ったことです...これは、このように修正されました:if(user.getUsername()。equals(username)|| user.getEmail()。equals(email)){ exists = true; 休憩。 } else { が存在する= false; (存在する場合){ presenter.onUserAlreadyExists(); } } else { presenter.onUserDoesNotExist(ユーザー名、メールアドレス、パスワード); } – joe

+0

確実なもの! :)あなたのためにすべてがうまくいけば、この答えを正しいものとしてマークすることを忘れないでください。 –

+0

それは働いている! :)乾杯! – joe

関連する問題