为什么 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);
我 运行 在尝试使用 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);