2016-05-07 1 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" 
     } 

Zunächst ist dies mein JSON. Nun, das Problem ist, wenn ich einen neuen Benutzer registriere, möchte ich die Registrierung nur zulassen, wenn Benutzername und E-Mail nie zuvor benutzt wurden (oder wenn beide bereits existieren).für Schleife scheint wie wird nicht aufhören, beim Schleifen DataSnapshot Kinder

Ich habe es MVP-Muster verwenden, so dass, wenn ich Taste registrieren, klicken, überprüft er Benutzername/emai/Passwort-Felder für die richtige Länge/Typ und wenn alles in Ordnung ist, ruft sie Moderators RegisterNewUser Methode:

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

die ruft dann Interaktorsystem die chekIfUserExists Methode:

@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); 

        } 
       } 
      } 

wenn Methode des Moderators onUserAlreadyExists genannt wird, setzt sie nur Fehlermeldungen „dieser Benutzername oder E-Mail bereits verwendet wird,“ ... und wenn Moderationsmethode onUserDoesNotExist aufgerufen wird es nennt interact ors Methode tryToRegister():

@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(); 
      } 
     }); 
    } 

Nun, das Problem in dieser for-Schleife ist:

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); 
        } 

Wenn ich mit den bestehenden E-Mail und anderen Benutzernamen versuchen zu registrieren, ist es die Schleife bricht und ruft Moderators onUserAlreadyExists Methode und sagt mir, dass Benutzername oder E-Mail bereits verwendet und neue Benutzer nicht erstellt wird, aber wenn ich versuche, mit bestehenden Benutzernamen und nicht vorhandenen E-Mail zu registrieren, bricht es die Schleife, sagt mir, dass Benutzername oder E-Mail bereits verwendet wird UND dann es erstellt einen neuen Benutzer mit bestehendem Benutzernamen und nicht existierender E-Mail ... fehle ich hier etwas?

Antwort

0

Das liegt daran, dass Ihre if/else-Anweisung für jeden Benutzernamen überprüft und ausgelöst wird.

Mit anderen Worten, wenn das neue Register nicht den Benutzernamen oder die E-Mail-Adresse des FIRST-Benutzers in der Datenbank hat, erstellt es immer noch einen neuen Benutzer, dann weiter zum nächsten Benutzer in der Datenbank, check, repeat , und fahren fort, bis es eine Kopie findet, dann sagt "dieser Benutzername oder eine E-Mail wird bereits verwendet" und nur dann stoppen.

Um dies zu beheben, sollten Sie nicht presenter.onUserDoesNotExist(username, email, password); aufrufen, bis Sie alle Benutzer im Snapshot durchgehen und sicherstellen, dass keine übereinstimmen.

Übrigens, großartige Dokumentation und Erklärung Ihres Problems.

+0

Danke Julian! :) Ja, das ist, was ich dachte ... es auf diese Weise behoben: if (user.getUsername(). Equals (Benutzername) || user.getEmail(). Equals (Email)) { exists = true; Pause; } sonst { existiert = false; } } wenn (existiert) { presenter.onUserAlreadyExists(); } else { presenter.onUserDoesNotExist (Benutzername, E-Mail, Passwort); } – joe

+0

sicher Ding! :) Wenn alles für dich gelaufen ist, vergiss nicht, diese Antwort als richtig zu markieren. –

+0

Es funktioniert! :) Prost! – joe

Verwandte Themen