【发布时间】: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