【问题标题】:RXJava "Single<Long> insert" only insert correctly before the activity is finished ( finish() )RXJava“Single<Long> insert”仅在活动完成之前正确插入(finish())
【发布时间】:2021-05-21 01:36:34
【问题描述】:

我在使用带有 Room 的 RXJava 时遇到了一些问题。我尝试插入一些数据并在插入 (onSucess) 之后调用 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);

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

有人可以帮助我吗?

【问题讨论】:

    标签: java android rx-java android-room sql-insert


    【解决方案1】:

    我的 RXJava 代码没有问题。

    当我打开数据库检查器时,我知道发生了什么。创建了两个数据库实例,因为我每次打开活动时都会调用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() 并不危险,尽管我不推荐哈哈。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-15
      • 1970-01-01
      • 2016-10-31
      • 2018-02-25
      • 1970-01-01
      • 1970-01-01
      • 2011-09-13
      • 2017-02-02
      相关资源
      最近更新 更多