Таким образом, комната устарела beginTransaction / setTransactionSuccessful / endTransaction и позволяет использовать runnables и вызываемые элементы в качестве замены функцией runInTransaction ().
Но, насколько я знаю, я не могу получить возвращаемое значение из runnable или callable. Как исправить код и удалить прямые транзакции без изменения функциональности?
Observable.fromCallable используется по двум причинам: для выполнения вызовов базы данных в потоке без пользовательского интерфейса и для получения значения, возвращаемого после его завершения.
Не пробовал никаких других подходов, так как я не уверен, какими могут быть другие подходы.
Observable.fromCallable(//Observable.fromCallable allows to return value to subscriber
() -> {
long entryId = 0;
db.beginTransaction();
if (info.isChanged())
entryId = db.biDao().insert(info);
if (info.xChanged())
db.xDao().insert(info.getX());
db.setTransactionSuccessful();
db.endTransaction();
return entryId;//after insertion our id in to a model it should be updated since it's 0 initialized by default
})
//.subscribeOn(Schedulers.single())
.subscribeOn(Schedulers.io())
//because we can set model data only on main thread
.observeOn(AndroidSchedulers.mainThread())
.subscribe(//either way we close db eventually
entryId -> {
if (entryId > 0)
someModel.setId(entryId);
someModel.setDataChanged(false);
db.close();
},//done
throwable -> {//error
db.close();
throwable.printStackTrace();
}
);
Я принимаю альтернативное решение, которое: 1) удаляет устаревание 2) запускает запросы к базе данныхв потоке без пользовательского интерфейса 3) устанавливает результаты запроса в потоке пользовательского интерфейса
, что я также пытался изменить часть кода, но это выглядит чертовски уродливо / неправильный способ использования "final long []". Есть альтернативы?
Observable.fromCallable(//Observable.fromCallable allows to return value to subscriber
() -> {
final long[] entryId = {0};
db.runInTransaction(new Runnable() {
@Override
public void run() {
if (info.isChanged())
entryId[0] = db.biDao().insert(info);
if (info.xChanged())
db.xDao().insert(info.getX());
}
});
return entryId[0];//after insertion our id in settingsModel should be updated since it's 0 initialized.
})
//.subscribeOn(Schedulers.single())
.subscribeOn(Schedulers.io())
//because we can set model data only on main thread
.observeOn(AndroidSchedulers.mainThread())
.subscribe(//either way we close db eventually
entryId -> {
if (entryId > 0)
someModel.setId(entryId);
someModel.setDataChanged(false);
db.close();
},//done
throwable -> {//error
db.close();
throwable.printStackTrace();
}
);