как предотвратить возникновение OnComplete при удалении несуществующего дочернего элемента или значения - PullRequest
0 голосов
/ 06 мая 2019

в качестве заголовка.OnCompleteListener сработает даже тогда, когда ребенка, которого я удаляю, не существует.Как я могу предотвратить срабатывание OnComplete (или OnSuccess) при удалении несуществующего дочернего элемента?

это код:

 ROOT_REF.child("111").removeValue().addOnCompleteListener(new OnCompleteListener<Void>() {
                   @Override
                   public void onComplete(@NonNull Task<Void> task) {
                       Log.d("SSSSSSSSSSSSSSSSSSSS","onComplete");
                   }
               });

примечание: дочерний элемент "111" не существует.

1 Ответ

1 голос
/ 06 мая 2019

Слушатель onComplete срабатывает, когда заданное вами состояние достигнуто на сервере. Невозможно изменить это поведение слушателя onComplete.

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

ROOT_REF.child("111").runTransaction(new Transaction.Handler() {
    @Override
    public Transaction.Result doTransaction(MutableData mutableData) {
        Object value = mutableData.getValue();
        if (value == null) {
            // Node doesn't exist
            return Transaction.success(mutableData);
        }

        // Remove value and report transaction success
        mutableData.setValue(null);
        return Transaction.success(mutableData);
    }

    @Override
    public void onComplete(DatabaseError databaseError, boolean b,
                           DataSnapshot dataSnapshot) {
        // Transaction completed
        Log.d(TAG, "postTransaction:onComplete:" + databaseError);
    }
});

Обратите внимание, что:

  • Метод транзакции doTransaction может запускаться несколько раз, именно тогда, когда другой пользователь уже изменил значение. Подробнее об этом см. FireBase runTransaction не работает - MutableData имеет значение null .
  • Поскольку транзакции считывают текущее значение узла, они работают только тогда, когда пользователь находится в сети.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...