我在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()
并不危险,无论如何我不建议哈哈。