这是我的查询
@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.
我理解原因,但需要返回值才能确定某个项目是否为“Fav”。
我使用RXjava进行其他数据库操作,但它们不需要返回值。
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());
当运行此查询时,最简单的方法是获得我的回调函数是什么?
使用Single更新问题:
这是我在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);
}
我需要从我的适配器和片段中进行此调用。当我这样调用时,我该如何做?
((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()))
这在我的SQLiteOpenHelper中引发了这个问题
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;
}
也许我的思考不够全面。我所尝试的只是确定我的表中是否存在这种媒体。
allowMainThreadQueries
添加到Room构建器中。当然,出于某种原因,默认情况下会阻止此操作。 - EpicPandaForce