Sala: el observador LiveData no se activa cuando se actualiza la base de datos

Estoy tratando de averiguar en el código a continuación, ¿por qué es que el observable LiveData de Room no me da nuevos cambios una vez que lleno la base de datos con nuevos datos?

Esto se pone en el método onCreate de mi actividad:

shiftsViewModel = ViewModelProviders.of(this).get(ShiftsViewModel.class);
shiftsViewModel
            .getShifts()
            .observe(this, this::populateAdapter);

Este es el método populateAdapter:

private void populateAdapter(@NonNull final List<Shift> shifts){

    recyclerView.setAdapter(new SimpleItemRecyclerViewAdapter(shifts));
}

También tengo el siguiente código que llena la base de datos (uso RxJava para hacer el trabajo en un subproceso de E / S, ya que Room necesita que se llame su código fuera del subproceso principal):

@Override
public Observable<List<Shift>> persistShifts(@NonNull final List<Shift> shifts){

    return Observable.fromCallable(() -> {

        appDatabase.getShiftDao().insertAll(shifts);
        return shifts;
    })
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread());
}

El problema que tengo ocurre cuando llamo persistShifts después de comenzar a observar mis shiftsViewModel. Esperaría que mi observador (LiveData) se activara con todos los cambios recién agregados. Resulta que el observador se activa, pero en su lugar se devuelve una lista vacía de turnos. La única forma de hacerlo "funcionar" es si dejo la actividad (por lo tanto, destruyo el ViewModel actual) y entro nuevamente. Esta vez, el LiveData de viewModel me da todos los cambios que persistieron anteriormente, como se esperaba.

Aquí está el resto del código:

@Entity
public class Shift{

   @PrimaryKey
   private long id;

   private String start;
   private String end;
   private String startLatitude;
   private String startLongitude;
   private String endLatitude;
   private String endLongitude;
   private String image;
   ...

DAO:

@Dao
public interface ShiftDAO {

   @Query("SELECT * FROM shift")
   LiveData<List<Shift>> getAll();

   @Query("SELECT * FROM shift WHERE id = :id")
   LiveData<Shift> getShiftById(long id);

   @Insert(onConflict = OnConflictStrategy.REPLACE)
   void insertAll(List<Shift> shifts);
}

ViewModel:

public class ShiftsViewModel extends AndroidViewModel{

   private final ISQLDatabase sqlDatabase;

   private MutableLiveData<Shift> currentShift;
   private LiveData<List<Shift>> shifts;
   private boolean firstTimeCreated;


   public ShiftsViewModel(final Application application){

      super(application);

      this.sqlDatabase = ((ThisApplication) application).getSQLDatabase();
      this.firstTimeCreated = true;
   }

   public MutableLiveData<Shift> getCurrentlySelectedShift(){

      if(currentShift == null){
         currentShift = new MutableLiveData<>();
      }

      return currentShift;
   }

   public LiveData<List<Shift>> getShifts() {

      if(shifts == null){
         shifts = sqlDatabase.queryAllShifts();
      }

     return shifts;
   }

   public void setCurrentlySelectedShift(final Shift shift){

      currentShift = getCurrentlySelectedShift();

      currentShift.setValue(shift);
   }

   public boolean isFirstTimeCreated(){
      return firstTimeCreated;
   }

   public void alreadyUsed(){
      firstTimeCreated = false;
   }
}

¿Por qué no obtengo la lista de turnos que persisto en la devolución de llamada observe () inmediatamente?

Respuestas a la pregunta(1)

Su respuesta a la pregunta