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

RXJava "Single<Long> insert" only insert correctly before the activity is finished ( finish() )

我在 Room 中使用 RXJava 时遇到了一些问题。我尝试插入一些数据并在插入 (onSucess) 调用 finish() 后关闭 activity.

如果我不在 activity 上调用 finish(),一切都很好,我插入了我想要的数据,返回的 ID 是正确的(1、2、3、4.. .) 和数据显示在 table 上。如果调用 finish() 并再次打开 activity,onSucess(Long aLong) 只有 returns id 1 而 table 不再更新。

有代码:

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);

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

有人可以帮助我吗?

我的 RXJava 代码没有问题。

我想通了打开数据库检查器时发生了什么。创建了两个数据库实例,因为我每次打开 activity.

都会调用 Room.inMemoryDatabaseBuilder

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

如果有人需要,这就是我用来保持最终数据库清洁的方式:

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()不危险,不管我不推荐哈哈。