RXJava "Single<Long> insert"仅在活动完成之前正确插入 ( finish() )



我在Room中使用RXJava时遇到一些问题。我试图插入一些数据,并在插入(onSuccess(之后调用finish()来关闭活动。

如果我不在活动中调用finish(),我插入我想要的数据量,返回的id是正确的(1、2、3、4…(,并且数据显示在表上,一切都会好起来。如果调用finish()并再次打开活动,则onSucess(Long aLong)只返回id 1,并且不再加载表。

有一个代码:

Client client = new Client();
client.birth_date = birthDate.toString();
client.health_status = healthStatus;
client.lives_with = livesWith;
client.name = name;
client.school_time = schoolTime;
singleObserver = database().clientDAO().insert(client);
singleObserver.subscribeOn(Schedulers.computation())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new DisposableSingleObserver<Long>() {
@Override
public void onSuccess(Long aLong) {
String formated = String.format(getApplication().getString(R.string.new_client_register), client.name);
Toast toast = Toast.makeText(getApplication(), formated, Toast.LENGTH_SHORT);
toast.show();
finish();
}
@Override
public void onError(Throwable e) {
}
});

在DAO中,我只是声明:

@Insert
Single<Long> insert(Client client);

我被困了两天,我没有发现我做错了什么。问题是,为什么Single的行为在我完成活动后有所不同。我试图取消订阅,并以某种方式搜索以销毁附加的变量,但行为仍然相同。

有人能帮我吗?

我的RXJava代码没有问题。

当我质问数据库检查员时,我发现了发生了什么。创建了两个数据库实例,因为每次打开活动时都会调用Room.inMemoryDatabaseBuilder

我只是忘记了调用singleton来保留一个唯一的实例(仅在开发应用程序时(

如果有人需要,这就是我用来保持最终数据库干净的方法:

public static synchronized Database getInstance(Context context) {
if (instance == null && !BuildConfig.DEBUG) {
instance = Room.databaseBuilder(context.getApplicationContext(),
Database.class,
DBNAME)
.allowMainThreadQueries()
// TODO: MIGRATE METHOD
// TODO: REMOVE BEFORE LAUNCH FOR FINAL USER, DATA LOSS DANGER!
.fallbackToDestructiveMigration()
.build();
}
// TODO: change build to release when launch
if (instance == null && BuildConfig.DEBUG) {
instance =Room.inMemoryDatabaseBuilder(context.getApplicationContext(),
Database.class)
.allowMainThreadQueries()
.build();
}
return instance;
}

注意:在我的情况下,allowMainThreadQueries()并不危险,无论如何我不建议哈哈。

最新更新