#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()
это не опасно, несмотря на то, что я не рекомендую, ха-ха.