Я пытаюсь удалить узел из моей базы данных в реальном времени 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 !!! Итак, все работает правильно!
Я что-то здесь не так делаю?