【问题标题】:How to avoid duplicate data in firebase Realtime database如何避免firebase实时数据库中的重复数据
【发布时间】:2019-01-07 14:47:51
【问题描述】:

我目前正在开发一个 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) {

        }
    });

扩展 该代码运行良好,它检查现有数据并显示 Toast 消息,但在数据仍进入数据库后,我想取消重复数据。

【问题讨论】:

  • 考虑到电子邮件地址是唯一的,您可以通过运行单个查询轻松解决该问题,该查询将检查 email 是否存在于数据库中,并在注册期间防止使用相同的电子邮件创建帐户。
  • if (dataSnapshotChild.child("Email").exists()){ } 可以解决问题@Yupi
  • email变量存在,我需要将数据与注册阶段填写的数据进行比较,如果我必须通过异常并防止和避免重复数据
  • 更新答案。

标签: java android firebase firebase-realtime-database


【解决方案1】:

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

.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.

        }
    })

并且您已阻止创建具有相同电子邮件地址的帐户,这实际上进行了不必要的检查 email 地址是否存在于数据库中,因为无法再创建具有相同 email 地址的新帐户。

如果您仍想检查数据库中是否存在电子邮件地址,您可以运行简单查询:

databaseReference.orderByChild("Email").equalTo(email).addListenerForSingleValueEvent....

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

【讨论】:

  • 我没有使用 Firebase 身份验证功能,我认为这不适合我的问题
【解决方案2】:

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

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

【讨论】:

  • 我可以知道你是否得到了 FoundChildern 变量
  • 糟糕......这是一个错字。修好了。
  • 嗨弗兰克,在这种情况下,该函数甚至不检查输入的数据。
  • 我(有意)对此没有任何改变,只是简化了代码并删除了多余的写入。如果您现在在调试器中单步执行它,哪一行没有按照您的预期执行?
猜你喜欢
  • 1970-01-01
  • 2019-03-09
  • 1970-01-01
  • 1970-01-01
  • 2015-09-11
  • 2015-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多