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

如何利用RxJava从Android Room数据库选择查询中获取返回

杜河
2023-03-14

这是我的问题

@Query("SELECT EXISTS(SELECT 1 FROM media2 WHERE path = :path AND isFav = 1 LIMIT 1)")
    int checkIsFav(String path);

从存储库调用

public boolean checkIsFav(String path) {
    return mDatabase.favDAO().checkIsFav(path) == 1;
}

这有时会导致以下错误

 java.lang.IllegalStateException: Cannot access database on the main thread since it may potentially lock the UI for a long period of time.
Observable.fromCallable(() -> mDatabase.favDAO().checkIsFav(path) == 1);

Observable.just(mDatabase)
    .subscribeOn(Schedulers.io())
    .subscribe(db -> db.favDAO().insertMedia2(media));

我正在我的片段中使用这个方法

if (mediaViewModel.checkIsFav(media.getPath())){
    mediaViewModel.removeFav(media.getPath());
} else {
    media.setFav(true);
    mediaViewModel.addFav(media);
}

和回收器适配器。

 boolean isfav = ((App)context.getApplicationContext()).getRepository()
     .checkIsFav(currentItem.getPath());

更新的问题与单人:

这是我在Dao中的查询

@Query("SELECT EXISTS(SELECT 1 FROM media2 WHERE path = :path AND isFav = 1 LIMIT 1)")
Single<Integer> checkIsFav(String path);

我在存储库中的方法

public Single<Integer> checkIsFav(String path){
    return mDatabase.favDAO().checkIsFav(path);
}
java prettyprint-override">((App)context.getApplicationContext()).getRepository().checkIsFav(media.getPath())
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread()).subscribe(
        new SingleObserver<Integer>() {
            @Override
            public void onSubscribe(Disposable d) {

            }

            @Override
            public void onSuccess(Integer integer) {

            }

            @Override
            public void onError(Throwable e) {

            }
        }
    );
if (App.favDB.existFav(currentItem.getPath()))
 public boolean existFav(String path) {
        SQLiteDatabase db = getReadableDatabase();
        Cursor cur = db.rawQuery(
            String.format("SELECT EXISTS(SELECT 1 FROM %s WHERE %s=? LIMIT 1)", TABLE_NAME, MEDIA_PATH),
            new String[]{ path });
        boolean tracked = cur.moveToFirst() &&  cur.getInt(0) == 1;
        cur.close();
        return tracked;
    }

也许我没有好好考虑这件事。

我要做的只是确定此介质是否存在于我的表中。

共有1个答案

巩选
2023-03-14

我认为你应该在主线程中观察你的数据。如此使用

observeOn(AndroidSchedulers.mainThread()).

尝试将其更改为

Observable.just(mDatabase)
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread()) 
        .subscribe(db -> db.favDAO().insertMedia2(media));

另请参阅以下关于observeon()的注释

 类似资料:
  • 我试图从获取数据。总共有9个表格,我必须相应地从所有表格中显示产品列表。 我考虑过使用连接,并尝试了左连接,如下所示: 这里是主表,pid是从tbl2到tbl9的所有表的。 注意:这里我在所有表上使用了来避免长查询,但是在实际的数据库操作中,只提到特定的列来提高性能。 现在实际的问题是,我没有得到所有的记录从表使用左加入。只检索中对应的每个条目的最后一行。 我使用了GROUP BY来避免重复的左连

  • 我有一个在AnyLogic中有2列的数据库表。我想知道查询dsl代码或sql代码,在将我的输入与第1列的值进行比较并进行线性插值后,从第2列的表中选择一个值。Anylogic中的代码提供了一个值

  • 我正在使用MVVM架构模式创建应用程序。我正在使用RxJava包装器从房间数据库而不是LiveData中获取数据。我已经设置了我的 DAO类和所有必要的方法来执行操作。我想知道如何使用存储库中的Flowable或Watable运算符获取数据。 下面是我的代码: 用户DAO。Java语言 用户epository.java MainActivityViewModel.java 有人请告诉我如何使用Rx

  • 问题内容: 我的代码有问题。 像这样的情况: 我有一个下拉列表,如果选择“个人”,则会出现新的下拉列表,其中包含从数据库查询中检索到的数据;如果选择“公开”,则该下拉列表将消失。 这样的HTML代码: 查询如下: 像这样的JavaScript代码: 我不知道如何将值/结果发送到javascript代码(选择选项中的值和名称)。 问题答案: 在javascript中,您必须对您的php文件进行操作:

  • 我正在使用Astyanax使用CQL3查询来查询Cassandra,它工作得很好。 前面的代码是连接的一部分,现在,我想执行查询并获取数据,但我不知道我希望查询中的数据类型,因此我不知道使用什么方法来获取值,如下面所示,我不知道是否需要使用、、等。 有没有办法让我知道这件事?使用这个API,或者使用不同的API。 谢谢你。

  • 好吧,我的问题是这段代码没有返回任何内容,至少它没有打印任何内容。唯一有效的方法是$user_email,它可以打印用户的电子邮件。 代码: “用户”表包含7个不同的键: ID(bigint,主键,auto_increment),组(int),电子邮件(varchar),密码(varchar),用户名(varchar),名称(varchar),验证(int)。 "group"表包含3个不同的键: