2017-02-11 7 views
1

Ich habe eine Aktivität mit einem Registrierungsformular, Wenn ein Benutzer erfolgreich registriert, erstellt ein neues Kind in meiner Datenbank und startet die Login-Aktivität.Firebase - Doppelte Einträge in die Datenbank

Das Problem ist, dass der Benutzer auf die Schaltfläche mehrmals klicken kann und es wird doppelte Benutzer erstellen, habe ich versucht, die Schaltfläche zu deaktivieren, wenn er es klickt und es nach dem Erstellen des neuen Benutzers aktivieren, aber es funktioniert nicht ..

Mein Code:

register_btn.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     final String username = txt_username.getText().toString().trim(); 
     final String password = txt_password.getText().toString().trim(); 
     final String email = txt_email.getText().toString(); 

     register_btn.setEnabled(false); 

     if(username.length() < 3) { 
      Toast.makeText(RegisterActivity.this, "Username must be atleast 3 characters long!", Toast.LENGTH_SHORT).show(); 
      register_btn.setEnabled(true); 
      return; 
     } 
     if(password.length() < 6) { 
      Toast.makeText(RegisterActivity.this, "Password must be atleast 6 characters long!", Toast.LENGTH_SHORT).show(); 
      register_btn.setEnabled(true); 
      return; 
     } 

     if(!validateEmail(email)) { 
      Toast.makeText(RegisterActivity.this, "The email entered is invalid", Toast.LENGTH_SHORT).show(); 
      register_btn.setEnabled(true); 
      return; 
     } 

     for(Map.Entry<String, Object> e : users.entrySet()) { 
      Map<String, Object> user = (HashMap<String, Object>) e.getValue(); 

      if(user.get("username").toString().equalsIgnoreCase(username)) { 
       Toast.makeText(RegisterActivity.this, "This username already exists", Toast.LENGTH_SHORT).show(); 
       register_btn.setEnabled(true); 
       return; 
      } 

      if(user.get("email").toString().equalsIgnoreCase(email)) { 
       Toast.makeText(RegisterActivity.this, "This email already exists", Toast.LENGTH_SHORT).show(); 
       register_btn.setEnabled(true); 
       return; 
      } 

      final String uid = randomUID(); 
      final int id = users.size() + 1; 

      Map<String, Object> newUser = createUser(id, username, password, email); 

      ref.child(uid).setValue(newUser); 

      Toast.makeText(RegisterActivity.this, "Successfully registered!", Toast.LENGTH_SHORT).show(); 

      Intent intent = new Intent(RegisterActivity.this, LoginActivity.class); 
      startActivity(intent); 

      register_btn.setEnabled(true); 

     } 
    } 
}); 

Benutzer ist eine Karte, die ständig aktualisiert wird, wenn die/Benutzer in meiner Datenbank

EDIT ändert: ich habe die ValueEventListener bearbeiten, damit es dele te dupliziert, wenn die Datenbank-Updates, es alte Duplikate des löschen, aber die neuen es does'nt:

ref.addValueEventListener(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     users = (HashMap<String,Object>) dataSnapshot.getValue(); 
     Map<String, Object> last_user = null; 

     for(Map.Entry<String, Object> e : users.entrySet()) { 
      Map<String, Object> user = (HashMap<String, Object>) e.getValue(); 
      if(last_user == null) { 
       last_user = user; 
       continue; 
      } 
      if(user.get("username").toString().equalsIgnoreCase(last_user.get("username").toString())) { 
       int id = Integer.parseInt(user.get("id").toString()); 
       int lid = Integer.parseInt(last_user.get("id").toString()); 
       if(id < lid || id == lid) { 
        FirebaseDatabase.getInstance().getReference("Users/" + e.getKey()).removeValue(); 
       } 
      } 

      last_user = user; 

     } 

    } 

    @Override 
    public void onCancelled(DatabaseError databaseError) { 
     Toast.makeText(RegisterActivity.this, "The following error occured", Toast.LENGTH_SHORT).show(); 
     Toast.makeText(RegisterActivity.this, databaseError.toString(), Toast.LENGTH_LONG).show(); 
    } 
}); 

Antwort

0

Sie eine uid für diesen Benutzer auswählen kann. Wenn er also erneut auf die Schaltfläche klickt, erstellt Firebase keinen anderen Benutzer, sondern aktualisiert stattdessen dessen Wert.

final String uid = ref.push().getKey(); //OR call for your randomuid() methodd if you prefer 
register_btn.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     final String username = txt_username.getText().toString().trim(); 
     final String password = txt_password.getText().toString().trim(); 
     final String email = txt_email.getText().toString(); 

     register_btn.setEnabled(false); 

     if(username.length() < 3) { 
      Toast.makeText(RegisterActivity.this, "Username must be atleast 3 characters long!", Toast.LENGTH_SHORT).show(); 
      register_btn.setEnabled(true); 
      return; 
     } 
     if(password.length() < 6) { 
      Toast.makeText(RegisterActivity.this, "Password must be atleast 6 characters long!", Toast.LENGTH_SHORT).show(); 
      register_btn.setEnabled(true); 
      return; 
     } 

     if(!validateEmail(email)) { 
      Toast.makeText(RegisterActivity.this, "The email entered is invalid", Toast.LENGTH_SHORT).show(); 
      register_btn.setEnabled(true); 
      return; 
     } 

     for(Map.Entry<String, Object> e : users.entrySet()) { 
      Map<String, Object> user = (HashMap<String, Object>) e.getValue(); 

      if(user.get("username").toString().equalsIgnoreCase(username)) { 
       Toast.makeText(RegisterActivity.this, "This username already exists", Toast.LENGTH_SHORT).show(); 
       register_btn.setEnabled(true); 
       return; 
      } 

      if(user.get("email").toString().equalsIgnoreCase(email)) { 
       Toast.makeText(RegisterActivity.this, "This email already exists", Toast.LENGTH_SHORT).show(); 
       register_btn.setEnabled(true); 
       return; 
      } 

      final int id = users.size() + 1; 

      Map<String, Object> newUser = createUser(id, username, password, email); 

      ref.child(uid).setValue(newUser); 

      Toast.makeText(RegisterActivity.this, "Successfully registered!", Toast.LENGTH_SHORT).show(); 

      Intent intent = new Intent(RegisterActivity.this, LoginActivity.class); 
      startActivity(intent); 

      register_btn.setEnabled(true); 

     } 
    } 
}); 
+0

Danke !!! Keine Duplikate mehr :) –

Verwandte Themen