Как поменять транзакцию устаревшей комнаты, не портя функциональность - PullRequest
0 голосов
/ 01 октября 2019

Таким образом, комната устарела 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();
                            }
                    );

...