Документ Firebase не удаляется - PullRequest
0 голосов
/ 09 января 2019

Я храню пользовательские токены устройств FCM в Firebase. Когда пользователь входит в систему, токен добавляется в профиль пользователя следующим образом:

        if (FirebaseAuth.getInstance().getCurrentUser()!=null) {

            FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener(new OnSuccessListener<InstanceIdResult>() {
                @Override
                public void onSuccess(InstanceIdResult instanceIdResult) {

                    DeviceToken token = new DeviceToken(instanceIdResult.getToken());

                    CollectionReference deviceTokens = mUserCollection.document(mSignedInUserID).collection("device_tokens");
                    deviceTokens.document(token.getTokenID()).set(token);

                }
            });
        }

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

            FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener(new OnSuccessListener<InstanceIdResult>() {
                @Override
                public void onSuccess(InstanceIdResult instanceIdResult) {

                    Log.d(TAG,instanceIdResult.getToken());
                    DocumentReference deactivatedToken = mUserCollection.document(mSignedInUserID).collection("device_tokens").document(instanceIdResult.getToken());
                    deactivatedToken.delete();
                    mAuth.signOut();
                    recreate();
                }
            });

В этом методе все работает, кроме фактического удаления этого документа, и оператор журнала подтверждает, что текущий идентификатор пользователя соответствует заголовку документа, который нужно удалить. Симуляция для зарегистрированного пользователя, записывающего данные в это местоположение, разрешена. Что я делаю не так?

1 Ответ

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

Обратите внимание, что с вашим кодом пользователь выйдет из системы до удаления документа. Это связано с тем, что delete() является асинхронным (как и все операции с базой данных) и немедленно возвращается до завершения работы. Если бы мне пришлось угадывать, я бы сказал, что ваш токен аутентификации стирается до того, как операция удаления действительно отправляется, и удаление эффективно действует как неаутентифицированный пользователь. Итак, что вам нужно сделать, это дождаться завершения удаления для фактического выхода пользователя из системы. Используйте задание, возвращаемое delete(), чтобы узнать, когда это закончится. Это будет работать так же, как Задание, возвращаемое getInstanceId().

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