Удалить данные из базы данных Firebase Realtime, когда пользователь закрывает приложение - PullRequest
0 голосов
/ 27 мая 2018

Я очень новичок в разработке Android и Firebase.

Мне нужна помощь со следующим:

После того, как пользователь аутентифицируется с помощью Firebase Password Authentication (фрагмент называется SignUp), этосохраняются как пользователи-> UID-> сообщения электронной почты в Базе данных реального времени. Затем они перемещаются в новый фрагмент - фрагмент AddUsername.Этот фрагмент запрашивает уникальное имя пользователя.

То, чего я пытаюсь добиться, - это если пользователь выходит и закрывает приложение без ввода имени пользователя, сохраненные данные из базы данных реального времени удаляются из консоли Firebase и пользователь возвращается к фрагменту регистрацииперезапустить процесс регистрации.Это предотвращает создание неактивных учетных записей электронной почты или учетных записей, которые были ошибочно «закрыты», и адрес электронной почты не может быть повторно использован.

Это мой код, и я не знаю, какой код мне нужен для этого.

РЕДАКТИРОВАТЬ: я добавил этот код в onDestroyView () фрагмента AddUsername.Данные в базе данных реального времени удаляются, когда я нажимаю кнопку «Назад», но когда я закрываю приложение, данные не удаляются.

 @Override
public void onDestroyView() {
    super.onDestroyView();


    mAuth.signOut();

    mDatabase.child("users").child(user.getUid()).removeValue();
    Log.i("User: ", "Not saved in database");

    user.delete()
            .addOnCompleteListener(new OnCompleteListener<Void>() {
                @Override
                public void onComplete(@NonNull Task<Void> task) {
                    if (task.isSuccessful()) {
                        Log.d(TAG, "User account deleted.");

                    }


                }



            });

}

Заранее спасибо.


открытый класс AddUsername расширяет Fragment реализует View.OnClickListener, TextWatcher {

public AddUsername() {

}


public interface FragmentComm {
    void toSetName();
}

private TextView title, headings, handleError;
private EditText addUsername;
private Button nextButton;
private String getUsername;
private FirebaseAuth mAuth;
private FirebaseUser user;
private DatabaseReference mDatabase;
private FragmentComm fragmentComm;

@Override
public void onAttach(Context context) {
    super.onAttach(context);

    fragmentComm = (FragmentComm) getActivity();
    user = FirebaseAuth.getInstance().getCurrentUser();
    mAuth = FirebaseAuth.getInstance();
    mDatabase = FirebaseDatabase.getInstance().getReference();

}

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.add_username, container, false);

    title = view.findViewById(R.id.username_title);
    headings = view.findViewById(R.id.display_user_message);
    handleError = view.findViewById(R.id.message_error);
    addUsername = view.findViewById(R.id.addUsername);
    nextButton = view.findViewById(R.id.nextButton);
    nextButton.setOnClickListener(this);
    addUsername.addTextChangedListener(this);


    return view;
}


@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {

}

@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {

}


@Override
public void afterTextChanged(Editable s) {


    getUsername = addUsername.getText().toString();

    if (getUsername.isEmpty()) {

        handleError.setVisibility(View.GONE);
        nextButton.setBackgroundColor(Color.parseColor("#EEEEEE"));
        nextButton.setTextColor(Color.parseColor("#BDBDBD"));
        nextButton.setEnabled(false);


    } else {

        Query query = FirebaseDatabase.getInstance().getReference().child("users").orderByChild("username").equalTo(getUsername);
        query.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                if (dataSnapshot.exists()) {

                    handleError.setText(R.string.username_not_available);
                    handleError.setVisibility(View.VISIBLE);
                    handleError.setTextColor(Color.parseColor("#F50057"));
                    nextButton.setBackgroundColor(Color.parseColor("#EEEEEE"));
                    nextButton.setTextColor(Color.parseColor("#BDBDBD"));
                    nextButton.setEnabled(false);

                } else {

                    handleError.setText(R.string.username_available);
                    handleError.setVisibility(View.VISIBLE);
                    handleError.setTextColor(Color.parseColor("#26C485"));
                    nextButton.setBackgroundColor(Color.parseColor("#0277BD"));
                    nextButton.setTextColor(Color.parseColor("#FFFFFF"));
                    nextButton.setEnabled(true);

                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {
                Log.i("Give info", "Error");


            }
        });

    }

}


@Override
public void onClick(View v) {

    switch (v.getId()) {

        case R.id.nextButton:

            checkUsernameAlreadyExist();

    }


}

private void checkUsernameAlreadyExist() {

    getUsername = addUsername.getText().toString();


    Query query = FirebaseDatabase.getInstance().getReference().child("users").orderByChild("username").equalTo(getUsername);
    query.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            if (dataSnapshot.exists()) {

                handleError.setText(R.string.username_not_available);
                handleError.setVisibility(View.VISIBLE);
                handleError.setTextColor(Color.parseColor("#F50057"));


            } else {

                handleError.setText(R.string.username_available);
                handleError.setVisibility(View.VISIBLE);
                handleError.setTextColor(Color.parseColor("#26C485"));

               fragmentComm.toSetName();
                setDatabaseName();

            }
        }


        @Override
        public void onCancelled(DatabaseError databaseError) {
            Log.i("Give info", "Error");


        }
    });

}


private void setDatabaseName() {

    mDatabase.child("users").child(user.getUid()).child("username").setValue(getUsername);


}

Ответы [ 2 ]

0 голосов
/ 27 мая 2018

Я думаю, что это может быть хорошим вариантом использования для обработчиков onDisconnect.Это инструкции по записи, которые приложение отправляет в базу данных Firebase при подключении, после чего сервер базы данных выполняет, как только обнаруживает, что клиент ушел.

Пример этого:

private void setDatabaseName() {
  DatabaseReference usernameRef = mDatabase.child("users").child(user.getUid()).child("username");
  usernameRef.setValue(getUsername);
  usernameRef.onDisconnection().removeValue();
}

Подробнее об этом см. Документацию Firebase по onDisconnect обработчикам .

Это будет работать только для базы данных.Возможно, вам придется найти другой способ очистки учетной записи Firebase Authentication.

Также обратите внимание, что подход, который вы используете для обеспечения уникальных имен пользователей, не очень эффективен.Для более идиоматического подхода см .:

0 голосов
/ 27 мая 2018

Я полагаю, что вам нужно добавить тот же код, который использовался для его удаления, в сочетании с проверкой условия if, если пользователь ввел имя пользователя или нет, в onStop() и onDestroy() самой операции

Однако имейте в виду, что если приложение имеет значение onPause(), оно может быть закрыто в обход методов onDestroy() и onStop(), поэтому, возможно, вам необходимо добавить свой код также в onPause(), но затем при возобновлении пользователь будетнужно начинать заново с начала

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