当前位置: 首页 > 知识库问答 >
问题:

检查数据库中是否已插入ROOM和RXJava项

阮轶
2023-03-14

我是一个拥有ROOM,RXJava和Android的新手。

在Android应用程序测试中,REST服务检索用户列表。如果用户已经存在,则必须修改此列表。如果该用户不存在,则将该用户插入到数据库中。如果用户已经存在,则不插入该用户。

在活动中的验证如下:

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));
          }
    }

Iserdao consiste en lo Siguiente:

@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) {

                }
            });
}

共有1个答案

邹浩
2023-03-14

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

首先,您应该理解使用活动的上下文来创建数据库--这是一个非常糟糕的主意。您应该改用应用程序上下文。

此外,您还尝试在此处使用命令式编程风格和反应式编程:

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

我认为在你问一些关于它的问题之前,你需要对反应编程和room框架进行更深入的研究。

至于你的问题--你应该避免没有主键的db实体。在这里您应该做的唯一一件事来解决您的问题--使用@insert(onConflict=onconflictStrategy.Ignore)和您的insert fun的签名应该是类似于Kotlin中的fun insertIfNotExists(User:User):completablecompletable insertIfNotExists(User User)(如果您使用Java

 类似资料:
  • 我正在将行插入房间数据库,我想检查该行是否已成功插入。 这是我的刀 当我插入一行时,响应为1、2、3,依此类推。。所以它返回的是(是这样吗?) 因此,需要检查行是否正确插入。 我是否可以检查插入的rowId是否大于0,然后将其成功插入数据库。 注意:我得到的结果是1,2,3等,应该是rowId。 请建议这种方法是否正确?基本上,如果插入不成功,我想阻止用户继续 谢谢你的建议和意见

  • 在这种情况下,我希望返回,但当我执行代码时,它会引发一个异常,并带有以下消息: 提供的值为空 我不能使用,因为Dao返回的是,所以应该返回相同的类型。 在不改变DAO的情况下,如何检查用户是否存在?

  • 我想用Rxjava使用ROOM,以下是我的代码: 我的数据库结构类: 这是我的ProductDAO课程: 这是我用于创建和管理数据库的数据库类: 这是我处理数据库的活动: 下面是发生的情况,当我第一次启动我的activity类时,没有发生错误,当我从emulator下载创建的数据库并在sqlite数据库管理器中打开它时,问题是文件是空的,没有创建数据库 当我回去重新打开数据库时,我得到了很多错误:

  • 问题内容: 将Apache Derby与Java结合使用(J2ME,但我认为这没有什么不同),是否有任何方法可以检查数据库是否已经存在并包含表? 问题答案: 除了MySQL之外,我什么都不知道,只有很少的解决方法,这与MySQL具有IF EXIST的功能不同。 您要做的是,尝试连接数据库,如果不可能的话。在成功建立连接之后,您可以执行简单的选择,例如SELECT count(*)FROM TABL

  • 我在房间数据库中使用MVVM架构模式,当使用Livedata和update row时,它会立即显示recylerview中的更改。 但是我想在mvvm中使用Rxjava而不是livedata来显示数据和更改,但是当更新一行时,它不会立即在recyclerview中显示更改。这是我的代码: 道 LessonRepository 视图模型 获取片段中列表的方法 更新行的方法 我应该做什么,我应该修复哪

  • 问题内容: 无法让Firebase识别已经输入的用户名。下面的代码显示我正在尝试将输入的用户名与数据库的DataSnapshot进行比较。该代码似乎没有拾取输入的用户名。代码是否错误? 在按钮上单击,我希望能够将用户引导到该错误,并且在该错误唯一之前,不应将该页面推送到下一个活动。 JSON树(如果有帮助) 问题答案: 是异步操作。设置回调后,代码将继续运行,而您尚未获取任何用户名。到您检查mSw