Java Firebase-重复插入数据库

Java Firebase-重复插入数据库,java,android,firebase,Java,Android,Firebase,我有一个带有注册表单的活动,当用户成功注册时,它会在我的数据库中创建一个新的子项并启动登录活动 问题是,用户可以多次单击按钮,它将创建重复的用户,我尝试在用户单击按钮时禁用该按钮,并在创建新用户后启用它,但它不起作用 我的代码: register_btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { final String usern

我有一个带有注册表单的活动,当用户成功注册时,它会在我的数据库中创建一个新的子项并启动登录活动

问题是,用户可以多次单击按钮,它将创建重复的用户,我尝试在用户单击按钮时禁用该按钮,并在创建新用户后启用它,但它不起作用

我的代码:

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

        }
    }
});
register\u btn.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
最终字符串username=txt_username.getText().toString().trim();
final String password=txt_password.getText().toString().trim();
最终字符串email=txt_email.getText().toString();
寄存器\u btn.setEnabled(假);
if(username.length()<3){
Toast.makeText(RegisterActivity.this,“用户名长度必须至少为3个字符!”,Toast.LENGTH_SHORT.show();
寄存器\u btn.setEnabled(真);
返回;
}
if(password.length()<6){
Toast.makeText(RegisterActivity.this,“密码长度必须至少为6个字符!”,Toast.LENGTH_SHORT.show();
寄存器\u btn.setEnabled(真);
返回;
}
如果(!validateEmail(电子邮件)){
Toast.makeText(RegisterActivity.this,“输入的电子邮件无效”,Toast.LENGTH_SHORT.show();
寄存器\u btn.setEnabled(真);
返回;
}
对于(Map.Entry e:users.entrySet()){
Map user=(HashMap)e.getValue();
if(user.get(“username”).toString().equalsIgnoreCase(username)){
Toast.makeText(RegisterActivity.this,“此用户名已存在”,Toast.LENGTH_SHORT.show();
寄存器\u btn.setEnabled(真);
返回;
}
if(user.get(“email”).toString().equalsIgnoreCase(email)){
Toast.makeText(RegisterActivity.this,“此电子邮件已存在”,Toast.LENGTH_SHORT.show();
寄存器\u btn.setEnabled(真);
返回;
}
最后一个字符串uid=randomUID();
final int id=users.size()+1;
Map newUser=createUser(id、用户名、密码、电子邮件);
ref.child(uid).setValue(newUser);
Toast.makeText(RegisterActivity.this,“已成功注册!”,Toast.LENGTH_SHORT.show();
意向意向=新意向(RegisterActivity.this、LoginActivity.class);
星触觉(意向);
寄存器\u btn.setEnabled(真);
}
}
});
“用户”是一个地图,每当“我的数据库”中的/users发生更改时,它就会不断更新

编辑:我已经编辑了ValueEventListener,因此每当数据库更新时,它都会删除重复项,它会删除旧的重复项,但不会删除新的重复项:

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();
    }
});
ref.addValueEventListener(新的ValueEventListener(){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
users=(HashMap)dataSnapshot.getValue();
Map last_user=null;
对于(Map.Entry e:users.entrySet()){
Map user=(HashMap)e.getValue();
if(最后一个用户==null){
最后用户=用户;
继续;
}
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());
如果(id
您可以为此用户选择一个uid。因此,如果他再次单击按钮,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);

        }
    }
});
final String uid=ref.push().getKey()//如果愿意,也可以调用randomuid()方法
register_btn.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
最终字符串username=txt_username.getText().toString().trim();
final String password=txt_password.getText().toString().trim();
最终字符串email=txt_email.getText().toString();
寄存器\u btn.setEnabled(假);
if(username.length()<3){
Toast.makeText(RegisterActivity.this,“用户名长度必须至少为3个字符!”,Toast.LENGTH_SHORT.show();
寄存器\u btn.setEnabled(真);
返回;
}
if(password.length()<6){
Toast.makeText(RegisterActivity.this,“密码长度必须至少为6个字符!”,Toast.LENGTH_SHORT.show();
寄存器\u btn.setEnabled(真);
返回;
}
如果(!validateEmail(电子邮件)){
Toast.makeText(RegisterActivity.this,“输入的电子邮件无效”,Toast.LENGTH_SHORT.show();
寄存器\u btn.setEnabled(真);
返回;
}
对于(Map.Entry e:users.entrySet()){
Map user=(HashMap)e.getValue();
if(user.get(“username”).toString().equalsIgnoreCase(username)){
Toast.makeText(RegisterActivity.this,“此用户名已存在”,Toast.LENGTH_SHORT.show();
寄存器\u btn.setEnabled(真);
返回;
}
if(user.get(“email”).toString().equalsIgnoreCase(email)){
Toast.makeText(RegisterActivity.this,“此电子邮件已存在”,Toast.LENGTH_SHORT.show();
寄存器\u btn.setEnabled(真);
返回;