【问题标题】:Why does this custom method of the DAO not work?为什么这个 DAO 的自定义方法不起作用?
【发布时间】:2021-03-02 22:20:22
【问题描述】:

我在尝试使用 android room 库将对象插入 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() 方法中的自定义代码没有被执行,我不知道为什么它不能以第一种方式工作?

感谢您的帮助。

【问题讨论】:

  • 只是一个想法,将 Dao 限制在 db 操作和单独的类中的逻辑代码可能在 ViewModel 中不是明智的吗?!
  • 也许创建一个单独的类是有意义的,但在 ViewModel 中并不是最优的,因为我需要在多个 ViewModel 中使用这些方法。感谢您的意见。

标签: android android-room rx-java2


【解决方案1】:

好的,我找到了问题。

当我调用抽象方法 _insertExerciseSet(set); 时,它不会被执行,因为返回类型是 Completable。所以我有两个选择让它发挥作用。


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


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

  @Insert
  public abstract void _insertExerciseSet(ExerciseSet exerciseSet);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-25
    • 2015-10-05
    • 2015-07-08
    • 1970-01-01
    • 2012-03-06
    • 2015-07-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多