Java 如何避免firebase实时数据库中的重复数据

Java 如何避免firebase实时数据库中的重复数据,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我目前正在开发一个Android应用程序,我使用firebase(实时功能)作为后端服务。此外,我开发了这个函数,如下所示 private void checkUserExisting (){ Dataa = mRef.getReference().child("Users"); Dataa.addListenerForSingleValueEvent(new ValueEventListener() { @Override public voi

我目前正在开发一个Android应用程序,我使用firebase(实时功能)作为后端服务。此外,我开发了这个函数,如下所示

 private void checkUserExisting (){
    Dataa = mRef.getReference().child("Users");
    Dataa.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            if (!dataSnapshot.exists()){
                CreateUserProfile();
            }else {
                final String Uname = name.getText().toString().trim();
                final String Email = emailAddress.getText().toString().trim();
                Iterator<DataSnapshot> dataSnapshots = dataSnapshot.getChildren().iterator();
                while (dataSnapshots.hasNext())
                {
                    DataSnapshot dataSnapshotChild = dataSnapshots.next();
                    String EmailAddress = dataSnapshotChild.child("Email").toString();
                    String UserName = dataSnapshotChild.child("UserName").toString();
                    if (Uname.equals(UserName) || Email.equals(EmailAddress)){
                        Toast.makeText(Sgin_Up.this,"This user already exists",Toast.LENGTH_LONG).show();
                        break;
                    }else {
                        CreateUserProfile();
                    }
                }
            }
            }
        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
private void checkUserExisting(){
Dataa=mRef.getReference().child(“用户”);
Dataa.addListenerForSingleValueEvent(新的ValueEventListener()){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
如果(!dataSnapshot.exists()){
CreateUserProfile();
}否则{
最后一个字符串Uname=name.getText().toString().trim();
最终字符串Email=emailAddress.getText().toString().trim();
迭代器dataSnapshots=dataSnapshot.getChildren().Iterator();
while(dataSnapshots.hasNext())
{
DataSnapshot dataSnapshotChild=dataSnapshots.next();
字符串EmailAddress=dataSnapshotChild.child(“电子邮件”).toString();
字符串UserName=dataSnapshotChild.child(“用户名”).toString();
if(Uname.equals(用户名)| | Email.equals(EmailAddress)){
Toast.makeText(Sgin_Up.this,“此用户已存在”,Toast.LENGTH_LONG.show();
打破
}否则{
CreateUserProfile();
}
}
}
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
}
});
扩展
代码运行得很好,它检查现有数据并显示Toast消息,但在数据仍进入数据库后,我希望作废重复数据。

创建新帐户或注册过程时,您可以检查用户是否已存在,例如:

.createUserWithEmailAndPassword(email, password).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
        @Override
        public void onComplete(@NonNull Task<AuthResult> task) {
            boolean isNewUser = task.getResult().getAdditionalUserInfo().isNewUser(); 
           //retruns true if user is new 
          //false if user exits, move on login screen/forgot password etc.

        }
    })

如果电子邮件存在,则会返回数据,如果数据库中没有该电子邮件的用户。

您现在正在循环内部创建。这意味着每次它发现一个不适合该新用户的节点时都会发生。这显然不是您想要的,因为只有在没有任何节点与新用户匹配时才应创建新配置文件。因此它必须在循环之外:

public void onDataChange(DataSnapshot dataSnapshot) {
    bool foundUser = false;
    final String Uname = name.getText().toString().trim();
    final String Email = emailAddress.getText().toString().trim();
    Iterator<DataSnapshot> dataSnapshots = dataSnapshot.getChildren().iterator();
    while (!foundUser && dataSnapshots.hasNext()) {
        DataSnapshot dataSnapshotChild = dataSnapshots.next();
        String EmailAddress = dataSnapshotChild.child("Email").toString();
        String UserName = dataSnapshotChild.child("UserName").toString();
        if (Uname.equals(UserName) || Email.equals(EmailAddress)){
            Toast.makeText(Sgin_Up.this,"This user already exists",Toast.LENGTH_LONG).show();
            foundUser = true;
        }
    }

    if (!foundUser){
        CreateUserProfile();
    }
}
public void onDataChange(DataSnapshot DataSnapshot){
bool foundUser=false;
最后一个字符串Uname=name.getText().toString().trim();
最终字符串Email=emailAddress.getText().toString().trim();
迭代器dataSnapshots=dataSnapshot.getChildren().Iterator();
而(!foundUser&&dataSnapshots.hasNext()){
DataSnapshot dataSnapshotChild=dataSnapshots.next();
字符串EmailAddress=dataSnapshotChild.child(“电子邮件”).toString();
字符串UserName=dataSnapshotChild.child(“用户名”).toString();
if(Uname.equals(用户名)| | Email.equals(EmailAddress)){
Toast.makeText(Sgin_Up.this,“此用户已存在”,Toast.LENGTH_LONG.show();
foundUser=true;
}
}
如果(!foundUser){
CreateUserProfile();
}
}

考虑到电子邮件地址是唯一的,您可以通过运行单个查询轻松解决该问题,该查询将检查数据库中是否存在
电子邮件,并在注册过程中防止使用相同的电子邮件创建帐户。如果(dataSnapshotChild.child(“电子邮件”).exists(){}这可以解决@YUPIT电子邮件变量存在的问题,我需要将数据与注册阶段填写的数据进行比较,如果它们太多,我需要通过异常来防止和避免重复数据更新答案。我没有使用Firebase身份验证功能,我认为这将不适合我的问题。我从您那里知道吗get FoundChildern variableWoops..这是一个错误。修复了它。嗨,Frank,在这种情况下,函数甚至不检查输入的数据。我(有意)对此没有做任何更改,只是简化了代码并删除了多余的写入。如果你现在在调试器中单步执行它,哪一行不符合你的预期?
public void onDataChange(DataSnapshot dataSnapshot) {
    bool foundUser = false;
    final String Uname = name.getText().toString().trim();
    final String Email = emailAddress.getText().toString().trim();
    Iterator<DataSnapshot> dataSnapshots = dataSnapshot.getChildren().iterator();
    while (!foundUser && dataSnapshots.hasNext()) {
        DataSnapshot dataSnapshotChild = dataSnapshots.next();
        String EmailAddress = dataSnapshotChild.child("Email").toString();
        String UserName = dataSnapshotChild.child("UserName").toString();
        if (Uname.equals(UserName) || Email.equals(EmailAddress)){
            Toast.makeText(Sgin_Up.this,"This user already exists",Toast.LENGTH_LONG).show();
            foundUser = true;
        }
    }

    if (!foundUser){
        CreateUserProfile();
    }
}