Tôi đang cố gắng tìm hiểu trong đoạn mã dưới đây, tại sao LiveData của phòng quan sát không cho tôi thay đổi mới khi tôi điền dữ liệu mới vào cơ sở dữ liệu.Room - LiveData Observer không kích hoạt khi cơ sở dữ liệu được cập nhật
này được đưa vào phương pháp onCreate hoạt động của tôi:
shiftsViewModel = ViewModelProviders.of(this).get(ShiftsViewModel.class);
shiftsViewModel
.getShifts()
.observe(this, this::populateAdapter);
Đây là phương pháp populateAdapter:
private void populateAdapter(@NonNull final List<Shift> shifts){
recyclerView.setAdapter(new SimpleItemRecyclerViewAdapter(shifts));
}
Tôi cũng có đoạn mã sau thao tác trên cơ sở dữ liệu (tôi sử dụng RxJava làm làm việc trên một chuỗi IO vì Phòng cần mã của nó để được gọi bên ngoài sợi chính):
@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());
}
Vấn đề tôi đã xảy ra khi tôi gọi persistShifts sau khi tôi bắt đầu quan sát shiftsViewModel của tôi. Tôi hy vọng rằng người quan sát của tôi (LiveData) sẽ được kích hoạt với tất cả các ca mới được thêm vào. Hóa ra người quan sát được kích hoạt, nhưng thay vào đó, danh sách thay đổi trống sẽ được trả lại. Cách duy nhất để làm cho nó "làm việc" là nếu tôi rời khỏi hoạt động (do đó phá hủy ViewModel hiện tại) và nhập lại. Lần này, LiveData của viewModel mang lại cho tôi tất cả các thay đổi trước đây vẫn tồn tại, như mong đợi.
Dưới đây là phần còn lại của các mã:
@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;
}
}
Tại sao tôi không nhận được danh sách các thay đổi tôi vẫn tồn tại trong quan sát() gọi lại ngay lập tức?
Bạn có thể hiển thị mã ViewModel của mình và địa điểm/cách bạn gọi getAll() không? – Lyla
Bất kỳ nội dung nào được cung cấp đều tốt, nhưng như được yêu cầu ở trên, hãy đăng ViewModel –
@Lyla ViewMã mã được thêm theo yêu cầu. – Tiago