Удаление узла с помощью транзакции не работает - PullRequest
0 голосов
/ 23 мая 2019

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

Этот код не работает! (P всегда равно нулю), если я не вызову метод транзакции дважды подряд, тогда он не будет нулевым во втором вызове. Почему?

mBookedSlotsNodeReference.child(booking.getUserUid())                 
.child(String.valueOf(booking.getStartTime())).runTransaction(new Transaction.Handler() {

  @Override
  public Transaction.Result doTransaction(MutableData mutableData) {
        BookedSlot p = mutableData.getValue(BookedSlot.class); // Checked in debug mode, and the value is null!
                    if (p != null) { 
                        //Delete BookedSlot
                        mutableData.setValue(null);
                        return Transaction.success(mutableData);
                    } else {
                        Log.e("Error","Node doesn't exist");
                        return Transaction.abort();
                    }

                @Override
                public void onComplete(DatabaseError databaseError, boolean b,
                                       DataSnapshot dataSnapshot) {
                    // Transaction completed
                    if (databaseError == null) {
                        if (dataSnapshot.getValue() == null) {
                            Log.e("Success","node deleted!");
                           } else {
                            Log.e("fail","something wierd happened!");
                           }
                    } else {
                      Log.e("db error", databaseError.getDetails()); 
                    }
                }
            });

Если я запрашиваю узел, он присутствует! Но почему это не найдено с помощью транзакции?

 mBookedSlotsNodeReference.child(booking.getUserUid())
                    .child(String.valueOf(booking.getStartTime())).addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                    dataSnapshot.getValue();// Checked in debug mode, and the value is correct!

                }

                @Override
                public void onCancelled(@NonNull DatabaseError databaseError) {

                }
            });

Структура БД Firebase:

Root{
   BookedSlots{
           UserUID{
                   UnixTimeStamp:
                                classRoom:
                                UnixTimeStamp:
                                UserUID:
                   }
          }
    }

BookedSlot pojo:

public class BookedSlot {
    private long UnixTimeStamp;
    private String classRoom;
    private String UserUID;

public BookedSlot() {
    }
 //getters + setters

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

Я что-то здесь не так делаю?

N.B .: Если я дважды вызываю метод транзакции, во втором вызове mutableData не будет иметь значение Null !!! Итак, все работает правильно!

Я что-то здесь не так делаю?

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