我正在尝试使用RxJava在后台线程上使用我的RoomDatabase。
我的DAO类:
import android.arch.persistence.room.Dao;
import android.arch.persistence.room.Insert;
import java.util.List;
@Dao
public interface MeasurementDAO
{
@Insert
public void insertMeasurements(Measurements m);
}
我的实体类(为简洁起见省略了getter和setter方法):
import android.arch.persistence.room.Entity;
import android.arch.persistence.room.PrimaryKey;
import android.support.annotation.NonNull;
@Entity
public class Measurements
{
@NonNull
@PrimaryKey
public String mId;
public String finalResultIn;
public String finalResultFt;
public String lengthFt;
public String widthFt;
public String heightFt;
public String lengthIn;
public String widthIn;
public String heightIn;
public Measurements(String finalResultFt, String finalResultIn, String lengthFt, String widthFt, String heightFt,
String lengthIn, String widthIn, String heightIn)
{
this.finalResultFt = finalResultFt;
this.finalResultIn = finalResultIn;
this.lengthFt = lengthFt;
this.widthFt = widthFt;
this.heightFt = heightFt;
this.lengthIn = lengthIn;
this.widthIn = widthIn;
this.heightIn = heightIn;
}
}
最后,这里是我的MeasurementDatabase类:
@Database(entities = {Measurements.class}, version = 1)
public abstract class MeasurementDatabase extends RoomDatabase
{
private static final String DB_NAME = "measurement_db";
private static MeasurementDatabase instance;
public static synchronized MeasurementDatabase getInstance(Context context)
{
if(instance == null)
{
instance = Room.databaseBuilder(context.getApplicationContext(), MeasurementDatabase.class,
DB_NAME)
.fallbackToDestructiveMigration()
.build();
}
return instance;
}
public abstract MeasurementDAO measurementDAO();
}
在我的片段中,我试图在单击菜单项后插入背景线程:
最终测量数据库appDb=
MeasurementDatabase.getInstance(getActivity());
//fill the values with the appropriate;
final Measurements m = new Measurements(
cubicInches.getText().toString(),
cubicFeet.getText().toString(),
len_ft.getText().toString(),
width_ft.getText().toString(),
height_ft.getText().toString(),
len_in.getText().toString(),
width_in.getText().toString(),
height_in.getText().toString());
Observable.just(appDb)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<MeasurementDatabase>(){
@Override
public void onSubscribe(Disposable d) {
appDb.measurementDAO().insertMeasurements(m);
}
@Override
public void onNext(MeasurementDatabase measurementDatabase)
{
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
我收到一个错误,说:
java.lang.IllegalStateException: Cannot access database on the main thread since it may potentially lock the UI for a long period of time.
我的RxJava代码中缺少了什么,没有将进程放在后台线程上?
我知道你有答案,但你永远不知道这是否失败。我确信您的dao insert方法可以返回一个长[](插入行的id)。
您可以轻松做到:
Completable.fromCallable(() ->
appDb.measurementDAO().insertMeasurements(m).length != 0 ?
Completable.complete() :
Completable.error(new IllegalStateException("Error inserting " + m.toString())))
.subscribeOn(Schedulers.io())
.subscribe(() -> { }, Throwable::printStackTrace);
多亏了@Commonware提供的一些线索,我才能够找到我丢失的部分:
Completable.fromAction(() -> appDb.measurementDAO().insertMeasurements(m))
.subscribeOn(Schedulers.io())
.subscribe();
创建一个可观察的并在其中编写您的逻辑。您可以订阅可观察的并获取布尔值。
public Observable<Boolean> insertObject(Measurements m) {
return Observable.create(new ObservableOnSubscribe<Boolean>() {
@Override
public void subscribe(ObservableEmitter<Boolean> e) {
appDb.measurementDAO().insertMeasurements(m);
e.onNext(true);
e.onComplete();
}
}).subscribeOn(Schedulers.io());
}
我正在尝试获取消息的地图,作者id键如下: 这是我尝试过的: MessageViewModel.getAll()方法返回: 然后我将其转换为一个可流动的流(Flowable::fromIterable),这样它可以一次发出一个项目,而不是整个列表,然后我使用“toMultiMap”进行映射 on成功方法从不被调用,我不知道这里出了什么问题。如果我不使用toMultiMap(并对代码进行相应的修改)
我在Livedata上使用了Room和RxJava,但它不起作用<我试了两种方法。我不知道为什么第二个有效,为什么第一个无效。 (1)按单条获取列表- 道 ViewModel我使用了Repository模式(dao的返回类型和Repository的返回类型相同) 碎片 它在创建片段时工作,但数据在更改时不更新。 道 视图模型 碎片 当数据发生变化时,它工作得很好。 我期待你的建议。 请让我知道,如
错误:查询有问题:[SQLITE_ERROR]SQL错误或缺少数据库(没有这样的表:任务) 显示了这个错误,我怎么可能修复它? 我正在学习这个教程
并且我发现了基于数据库版本4的可能场景的迁移varargs。 我的问题是,假设我使用的是db v1的Room,当我的应用程序到达db v10时,我将不得不编写多少迁移方法? 在sqlite中,我们在中获得已安装应用程序的当前db版本,我们只需通过开关大小写而不使用break语句,以便满足所有db升级。
我是新来的和我试图我的得到一个从它。我试图这样做的它与这是id但问题是我不知道如何返回目标从。 这就是<代码>刀 这是Repository类
我正在使用MVVM架构模式创建应用程序。我正在使用RxJava包装器从房间数据库而不是LiveData中获取数据。我已经设置了我的 DAO类和所有必要的方法来执行操作。我想知道如何使用存储库中的Flowable或Watable运算符获取数据。 下面是我的代码: 用户DAO。Java语言 用户epository.java MainActivityViewModel.java 有人请告诉我如何使用Rx