当前位置: 首页 > 知识库问答 >
问题:

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

黄意智
2023-03-14

我目前正在开发一个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消息,但在数据仍进入数据库后,我想消除重复数据。

共有2个答案

卢知
2023-03-14

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

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();
    }
}
东方国安
2023-03-14

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

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

        }
    })

而且,您已经阻止使用相同的电子邮件地址创建帐户,这实际上使得不必要的检查数据库中是否存在电子邮件地址,因为不可能再使用相同的电子邮件地址创建新帐户。

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

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

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

 类似资料:
  • 我在Android应用程序中使用Firebase实时数据库,并且有如下数据: 数据库映像 我想删除周末所有用户的“点”:选项卡。每个周末自动删除。我该怎么做呢。

  • 问题内容: 某些数据库功能(例如和)很容易受到死锁的影响,因为数据库未指定将使用哪种锁定顺序。我发现有两次 讨论暗示此行为不是SQL标准指定的,更不用说具体的实现了。因此,我在假设我们无法控制锁定顺序的情况下进行操作(至少,这样做并不明显)。 如果我们不能依赖锁定顺序,应该如何避免数据库死锁? 如果我们不应该避免僵局(您将不得不非常努力地说服我),那么我们应该怎么做? 这个问题与数据库无关,所以请

  • 我试图Conconat 2 DataFrames,但. Join正在创建一个不需要的副本。 我试过: 但这返回了一个我理解的错误(“concat未能重新索引,仅对唯一值的索引对象有效”) 我试着: 它没有给出错误,但给出以下数据帧: 我的问题是重复的10.1和400在时间戳1520259275。它们不在原始df_bid数据框中两次,应该只在这个df中出现一次。有两行相同的时间戳是正确的,因为此时有

  • 我有下一个示例代码: 你可以看到id是JSON格式中的一个重复字段,我知道PostgreSQL有一些功能可以避免这个问题,但我找不到。

  • 我正在一个聊天应用程序,其中消息存储在firebase实时数据库。现在,如果我创建一个如下所示的节点(Chats-Better-A-ID和-B-ID是自动生成的聊天室密钥),那么我想知道当用户S在聊天应用程序中打开与用户T聊天时,so数据库将只读取存储在Chats-Better-S-T-ID中的消息,而不会读取其他聊天室消息!?我说的对吗?如果是,那么它会降低定价吗? 或 如果我存储如下所示的数据

  • 我正在尝试读取我的Flutter应用程序中的firebase实时数据库中的数据,并将其分配给模型类,但是,我在控制台中得到了以下错误。 下面是我到目前为止所做的代码 员工类别 我不知道我做错了什么,请帮我解决这个问题