RxJava «Одиночная вставка» правильно вставлять только до завершения действия ( готово() )

#java #android #rx-java #android-room #sql-insert

Вопрос:

У меня возникли некоторые проблемы с использованием RxJava с комнатой. Я пытаюсь вставить некоторые данные и после вызова insert (onSucess) finish() закрыть действие.

Все в порядке, если я не вызываю finish() активность, я вставляю столько данных, сколько хочу, возвращаемые идентификаторы правильные (1, 2, 3, 4…) и данные отображаются в таблице. Если позвонить finish() и снова открыть действие, onSucess(Long aLong) возвращается только идентификатор 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) {

        }
});
 

В ДАО я просто заявляю:

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

Я застрял в этом на 2 дня, и я не понимаю, что я делаю не так. И вопрос в том, почему Single поведение меняется после того, как я заканчиваю упражнение. Я попытался отказаться от подписки и попытался каким-то образом уничтожить прикрепленную к ней переменную, но поведение все равно осталось прежним.

Кто-нибудь может мне помочь?

Ответ №1:

С моим кодом RxJava проблем нет.

Я понял, что произошло, когда я вызвал инспектора базы данных. Создаются два экземпляра базы данных, потому что я звоню Room.inMemoryDatabaseBuilder каждый раз, когда открываю действие.

Я просто забыл вызвать синглтон, чтобы сохранить уникальный экземпляр (только при разработке приложения).

Если кому-то нужно, это способ, которым я пользуюсь, чтобы поддерживать чистоту окончательной базы данных:

 public static synchronized Database getInstance(Context context) {
        if (instance == null amp;amp; !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 amp;amp; BuildConfig.DEBUG) {
            instance =Room.inMemoryDatabaseBuilder(context.getApplicationContext(),
                    Database.class)
                    .allowMainThreadQueries()
                    .build();
        }

    return instance;
}
 

Примечание: В моем случае allowMainThreadQueries() это не опасно, несмотря на то, что я не рекомендую, ха-ха.