java - 查询数据库以确保新用户不会使用已有的用户名进行注册

标签 java android firebase firebase-realtime-database firebase-security

我想要实现的是,当新用户注册时,我想运行查询以确保他们选择的用户名不属于其他用户。为此,我编写了 register(); 方法,但它没有返回任何内容,也没有指示用户名已被占用的 Toast 消息,也没有返回任何内容。它带我到下一页,表明电子邮件已发送,用户现在必须登录。

有人可以向我解释一下我做错了什么吗?

注册 Activity

private void register(final String username, final String fullname, String email, String password) {
        DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Users");
        reference.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                boolean ifUsernameExists = false;
                for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                    User user = snapshot.getValue(User.class);
                    if (user != null) {
                        if (username.equals(user.getUsername())) {
                            Toast.makeText(RegisterActivity.this, "That username has already been taken. Try another", Toast.LENGTH_SHORT).show();
                            ifUsernameExists = true;
                        }
                    }
                }

                if (!ifUsernameExists) {
                    mAuth.createUserWithEmailAndPassword(email, password).addOnCompleteListener(RegisterActivity.this, task -> {
                        if (task.isSuccessful()) {
                            sendVerificationEmail();
                            FirebaseUser firebaseUser = mAuth.getCurrentUser();
                            String userid = firebaseUser.getUid();

                            mReference = FirebaseDatabase.getInstance().getReference().child("Users").child(userid);

                            HashMap<String, Object> hashMap = new HashMap<>();
                            hashMap.put("id", userid);
                            hashMap.put("email", email);
                            hashMap.put("username", username.toLowerCase());
                            hashMap.put("fullname", fullname);
                            hashMap.put("bio", "");
                            hashMap.put("imageurl", "https://firebasestorage.googleapis.com/v0/b/events-50eda.appspot.com/o/Placeholder.png?alt=media&token=0e651fa8-32e9-4f42-be9a-a5365f44b0f4");

                            mReference.setValue(hashMap).addOnCompleteListener(task1 -> {
                                if (task1.isSuccessful()) {
                                    FirebaseAuth.getInstance().signOut();
                                    Intent intent = new Intent(RegisterActivity.this, LoginActivity.class);
                                    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
                                    startActivity(intent);
                                }
                            });
                        } else {
                            Toast.makeText(RegisterActivity.this, "You can't register with that email", Toast.LENGTH_LONG).show();
                            mProgressDialog.dismiss();
                        }
                    });
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });
    }

最佳答案

您在用户变量中查找的值丢失了。我会将其打印出来并运行调试来检查我在哪里丢失了它。

关于java - 查询数据库以确保新用户不会使用已有的用户名进行注册,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62015014/

相关文章:

java - Hibernate 写入后读取导致找不到对象

java - 在 ArrayBlockingQueue 中,为什么要将 final 成员字段复制到本地 final 变量中?

android - 如何一次性否定 View 的颜色?

java - Android透明Fragment/GoogleMap

python - 导入错误: cannot import name 'RSA' from 'Crypto.PublicKey'

java - Tomcat 提示由于 JDBC 驱动程序关闭后打开连接导致内存泄漏

java - 在 mac os 上配置 hadoop namenode 时出现 yarn-site.xml 错误

Android获取FragmentPagerAdapter中的 fragment

javascript - Second orderBy 查询在 Firestore 中不执行任何操作(react-native-firebase)

node.js - 如何用nodejs进行动态调度?