2017-02-11 9 views
1

私は登録フォームでアクティビティを持っています。ユーザが正常に登録すると、データベースに新しい子が作成され、ログインアクティビティが開始されます。Firebase - データベースへの重複挿入

問題は、ユーザーがボタンを複数回クリックすると重複するユーザーが作成され、クリックしたときにそのボタンを無効にしてから新しいユーザーを作成した後に有効にしたが、機能しないという点です。

マイコード:それはDELEますので、私はValueEventListenerを編集しました:

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

     } 
    } 
}); 

ユーザーは常に私のデータベースで/ユーザが

EDITを変更するたびに更新される地図でありますあなたはこのユーザーのUIDを選択することができ

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

答えて

0

:それはの古い写しが、それはdoes'nt新しいものを削除し、TE重複するたびにデータベースの更新、。したがって、彼がボタンを再びクリックすると、Firebaseは別のユーザを作成することはありませんが、代わりにその値を更新します。

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

ありがとうございました!もう重複はありません:) –

関連する問題