相关疑难解决方法(0)

Room - LiveData观察器在数据库更新时不会触发

我试图在下面的代码中找到,为什么一旦我用新数据填充数据库,Room的LiveData observable就不会给我新的转变.

这是我的活动的onCreate方法:

shiftsViewModel = ViewModelProviders.of(this).get(ShiftsViewModel.class);
shiftsViewModel
            .getShifts()
            .observe(this, this::populateAdapter);
Run Code Online (Sandbox Code Playgroud)

这是populateAdapter方法:

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

    recyclerView.setAdapter(new SimpleItemRecyclerViewAdapter(shifts));
}
Run Code Online (Sandbox Code Playgroud)

我还有以下代码填充数据库(我使用RxJava在IO线程上完成工作,因为Room需要在主线程之外调用它的代码):

@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());
}
Run Code Online (Sandbox Code Playgroud)

在我开始观察我的shiftViewModel之后调用persistShifts时出现的问题.我希望我的观察者(LiveData)会被所有新添加的班次触发.事实证明,观察者被触发了,但是返回了一个空的移位列表.使其"工作"的唯一方法是,如果我离开活动(因此销毁当前的ViewModel)并再次输入.这次viewModel的LiveData为我提供了之前保持的所有变化,正如预期的那样.

这是代码的其余部分:

@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;
   ...
Run Code Online (Sandbox Code Playgroud)

DAO:

@Dao
public interface ShiftDAO {

   @Query("SELECT * FROM …
Run Code Online (Sandbox Code Playgroud)

android viewmodel android-room android-livedata android-architecture-components

17
推荐指数
1
解决办法
7087
查看次数