【发布时间】:2021-02-12 18:33:39
【问题描述】:
我是 ROOM、RXJava 和 Android 的新手。
在 Android 应用程序测试中,REST 服务检索用户列表。如果用户已经存在,则必须修改此列表。如果用户不存在,则将用户插入数据库。如果用户已经存在,则不插入用户。
在Activity验证如下:
UserRepository repo = new UserRepository(LoadingActivity.this);
for (int i = 0; i < list.size(); i++){
if (!repo.existsUser(list.get(i))){
repo.insert(list.get(i));
}
}
El UserDao 始终如一:
@Query("select count(*) from users where name = :userName and email = :userEmail")
Single<Long> existsUser(int userName , String userEmail);
El UserRepository contiene lo siguiente:
private AppDatabase db;
public UserRepository(Context context){
this.db = AppDatabase.getDatabase(context);
}
public boolean existsUser(User item){
final boolean[] existe = {false};
db.userDao().existsUser(item.getName(), item.getEmail())
.subscribeOn(Schedulers.io())
.subscribe(query -> existe[0] = query > 0);
return existe[0];
}
public void insert(User user){
db.userDao().insert(user)
.subscribeOn(Schedulers.computation())
.subscribe(new CompletableObserver() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onComplete() {
}
@Override
public void onError(Throwable e) {
}
});
}
假设existe[0]在尝试插入老用户时应该被赋予真值。但是existe[0] = query > 0总是跟在return语句后面,所以这种方式行不通。
RXJava 是否有可能返回一个布尔值或任何值?有没有其他方法可以制作我正在尝试的东西?
考虑到检索到的数据没有主键,我想避免使用 dao 规则 @Insert(onConflict = OnConflictStrategy.IGNORE)
【问题讨论】:
标签: android rx-java android-room