Как избежать дублирования данных в базе данных Firebase в реальном времени - PullRequest
0 голосов
/ 07 января 2019

В настоящее время я занимаюсь разработкой приложения для 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) {

        }
    });

Expansions Код работает довольно хорошо, и он проверяет существующие данные, а также отображает сообщение Toast, но после того, как данные все еще попадают в базу данных, я хочу исключить дублирование данных.

Ответы [ 2 ]

0 голосов
/ 07 января 2019

Вы сейчас создаете внутри цикла. Это значит, что каждый раз находит узел, который не для этого нового пользователя. Это явно не то, что вам нужно, поскольку новый профиль следует создавать только в том случае, если 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();
    }
}
0 голосов
/ 07 января 2019

При создании новой учетной записи или регистрации вы можете проверить, существует ли пользователь, например:

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

, который вернет данные, если электронная почта существует, если нет, то в базе данных нет пользователя с таким электронным письмом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...