为什么 DAO 的这个自定义方法不起作用?

Why does this custom method of the DAO not work?

我 运行 在尝试使用 android 房间库将对象插入 sqlite 数据库时遇到问题。

我有以下 dao:

@Dao
public abstract class ExerciseSetDao {
  public Completable insertExerciseSet(ExerciseSet set) {
    Completable completableSource = Completable.create(emitter -> {
      try {
        if(set.getRepRange() != null) {
          set.getRepRange().setOwnerExerciseSetId(set.getExerciseSetId());
        }

        _insertExerciseSet(set);

        emitter.onComplete();

      } catch (Exception e) {
        emitter.onError(e);
      }
    });

    return completableSource;
  }

  @Insert
  public abstract Completable _insertExerciseSet(ExerciseSet exerciseSet);
}

在我的视图模型中,我是这样使用它的:

public void addExerciseSetButtonClick() {
  db.repRangeDao()
    .insertRepRange(repRangeForExerciseSet)
    .subscribeOn(Schedulers.newThread())
    .subscribe();

  exerciseSetToAdd.setRepRange(repRangeForExerciseSet);
  
  db.exerciseSetDao()
    .insertExerciseSet(exerciseSetToAdd)
    .subscribeOn(Schedulers.newThread())
    .subscribe();
}

现在的问题是,当我检查数据库文件时,我发现上述方法的第一个命令中的 repRangeForExerciseSet 已完美插入,但 exerciseSetToAdd 未插入到数据库。但是当我将最后一行更改为以下内容时(直接使用抽象方法):

db.exerciseSetDao()
  ._insertExerciseSet(exerciseSetToAdd)
  .subscribeOn(Schedulers.newThread())
  .subscribe();

...对象也被添加到数据库中。但是现在我在 insertExerciseSet() 方法中的自定义代码没有被执行,我不知道为什么它不能以第一种方式工作?

感谢您的帮助。

好的,我找到问题了。

当我调用抽象方法 _insertExerciseSet(set); 时,它没有被执行,因为 return 类型是一个 Completable。所以我有两个选择来让它工作。


像这样用 .subscribe(); 调用 Completable _insertExerciseSet(set).subscribe();


或者将抽象方法 _insertExerciseSet 的 return 类型更改为 void,因为它在从 insertExerciseSet 方法调用时已经在单独的线程中执行。

  @Insert
  public abstract void _insertExerciseSet(ExerciseSet exerciseSet);