【问题标题】:Check database if an item has been already inserted with ROOM and RXJava检查数据库是否已使用 ROOM 和 RXJava 插入项目
【发布时间】: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 &gt; 0总是跟在return语句后面,所以这种方式行不通。

RXJava 是否有可能返回一个布尔值或任何值?有没有其他方法可以制作我正在尝试的东西?

考虑到检索到的数据没有主键,我想避免使用 dao 规则 @Insert(onConflict = OnConflictStrategy.IGNORE)

【问题讨论】:

    标签: android rx-java android-room


    【解决方案1】:

    你的代码有很多不同类型的问题。

    首先,您应该了解使用 Activity 的上下文创建数据库 - 非常糟糕的主意。您应该改用应用程序上下文。

    您还尝试在这里使用命令式编程风格和反应式编程:

    if (!repo.existsUser(list.get(i))){
        repo.insert(list.get(i));
    }
    

    我认为您需要更深入地研究响应式编程和房间框架,然后再提出一些问题。

    至于您的问题 - 您应该避免没有主键的 db 实体。 在这里你应该做的唯一一件事是解决你的问题 - 使用 @Insert(onConflict = OnConflictStrategy.IGNORE) 和插入乐趣的签名应该是像这样的 fun insertIfNotExists(user: User): Completable 在 Kotlin 或 Completable insertIfNotExists(User user) 如果你使用 Java

    【讨论】:

    • 您对主键的看法是正确的,因此重新检索 ID 并使用 Room-Dao onConflict 签名可以更轻松地管理数据(尽管这是服务提供数据的方式......不知道为什么)。我是盲目的计划逻辑来检索查询周围的布尔值,因此如果我决定采用这种方式,使用 Transaction Dao 签名将是一个更好的选择。感谢有关应用程序/活动上下文的建议! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-20
    相关资源
    最近更新 更多