Próbuję dowiedzieć się w poniższym kodzie, dlaczego obserwowane LiveData pokoju nie daje mi nowych zmian, gdy zapełniłem bazę danych nowymi danymi.Pokój - obserwator LiveData nie uruchamia się, gdy baza danych jest aktualizowana
ten jest umieszczany na onCreate metody mojej działalności to:
shiftsViewModel = ViewModelProviders.of(this).get(ShiftsViewModel.class);
shiftsViewModel
.getShifts()
.observe(this, this::populateAdapter);
Jest to metoda populateAdapter:
private void populateAdapter(@NonNull final List<Shift> shifts){
recyclerView.setAdapter(new SimpleItemRecyclerViewAdapter(shifts));
}
ja też mam następujący kod, który zapełnia bazę danych (używam RxJava wykonać działa w wątku IO, ponieważ Room wymaga kodu poza głównym wątkiem):
@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());
}
Problem, który mam, kiedy wywołuję persistShift po tym, jak zacznę obserwować mój shiftsViewModel. Spodziewałbym się, że mój obserwator (LiveData) zostanie uruchomiony przy wszystkich nowo dodanych zmianach. Okazuje się, że obserwator jest wyzwalany, ale zamiast tego zwracana jest pusta lista zmian. Jedynym sposobem, aby to "działało", jest opuszczenie działania (dlatego zniszczenie bieżącego ViewModel) i ponowne wejście. Tym razem LiveData widokuModel daje mi wszystkie przesunięcia wcześniej utrwalone, zgodnie z oczekiwaniami.
Oto reszta kodu:
@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;
}
}
Dlaczego nie otrzymuję listę przesunięć I utrzymują się w return() callback od razu?
Czy możesz pokazać swój kod ViewModel i gdzie/jak dzwonisz getAll()? – Lyla
Niezależnie od tego, pod warunkiem, wyglądają dobrze, ale jak pytano powyżej post ViewModel –
@Lyla ViewModel kod dodany na żądanie. – Tiago